ログ出力

取り敢えずコンソールに出力して確認できるくらいのログ機能が欲しくなったので、作ってみました（将来的に拡張予定）。

プログラムを書くと擬人化して名前とか愛称とか付けたくなりませんか？（普通の人はなりませんね、はい。すいません）。

今回は「美海（みう）」という名前にしました。愛称は「みうたそ」です。呼ぶときは「みうたそ～」と呼んでください。

みうたそ～。

![3211db55.jpg](https://qiita-image-store.s3.amazonaws.com/0/10969/64b10815-2423-90da-ecdc-80cb32a2b5de.jpeg)

```csharp
    //運用記録作成
    //擬人化　名前：美海（みう）　愛称：みうたそ
    public class Logger
    {
        //正式名称
        private static readonly string FormalName = "logger";
        //名前
        private static readonly string Name = "美海";
        //愛称
        private static readonly string Nickname = "みうたそ";
        //名前（ローマ字表記）
        private static readonly string NameRoma = "Miu";
        //愛称（ローマ字表記）
        private static readonly string NicknameRoma = "Miutaso";

        //既定の住所
        public static readonly string DefaultAddress = "defaultLogRepository";

        //指定された住所の運用記録保管所に接続する
        //!<未実装>
        //今は何もしない
        public bool Connect(string address)
        {
            return true;
        }

        //運用記録を発行する
        //!<未改良>
        //最終的には運用記録出力処理などは運用記録保管所の仕事にする
        public bool IssueLog(LogItem logItem)
        {
            //運用記録の種類が重大である場合の文字色
            const ConsoleColor critical = ConsoleColor.Magenta;
            //運用記録の種類が過誤である場合の文字色
            const ConsoleColor error = ConsoleColor.Red;
            //運用記録の種類が警告である場合の文字色
            const ConsoleColor warning = ConsoleColor.Yellow;
            //運用記録の種類が情報である場合の文字色
            const ConsoleColor information = ConsoleColor.Cyan;
            //運用記録の種類が詳細である場合の文字色
            const ConsoleColor verbose = ConsoleColor.White;

            //コンソールの既定の文字色
            const ConsoleColor def = ConsoleColor.Gray;

            //運用記録の種類に応じてコンソールの文字色を適切なものに変更する
            if (logItem.Type == LogType.Critical)
                Console.ForegroundColor = critical;
            else if (logItem.Type == LogType.Error)
                Console.ForegroundColor = error;
            else if (logItem.Type == LogType.Warning)
                Console.ForegroundColor = warning;
            else if (logItem.Type == LogType.Information)
                Console.ForegroundColor = information;
            else if (logItem.Type == LogType.Verbose)
                Console.ForegroundColor = verbose;
            //運用記録の種類が存在しないものである場合には警告の運用記録を出力する
            else
            {
                const string id = "6a5b9197-4f43-4fef-9697-9b1462c03ab0";
                const string text = "not existed log type";
                const LogType type = LogType.Warning;

                IssueLog(new LogItem(Guid.Parse(id), text, type, FormalName));
            }

            //運用記録の文言をコンソールに出力する
            Console.WriteLine(logItem.Text);

            //コンソールの文字色を既定のものに戻す
            Console.ForegroundColor = def;

            return true;
        }
    }

    //運用記録
    public class LogItem
    {
        public LogItem(Guid _id, string _text, LogType _type)
        {
            Id = _id;
            Text = _text;
            Type = _type;

            //時刻として現在時刻を設定する
            Datetime = DateTime.Now;
        }

        public LogItem(Guid _id, string _text, LogType _type, string _source)
        {
            Id = _id;
            Text = _text;
            Type = _type;

            Source = _source;

            //時刻として現在時刻を設定する
            Datetime = DateTime.Now;
        }

        public LogItem(Guid _id, string _text, LogType _type, Info _info)
        {
            Id = _id;
            Text = _text;
            Type = _type;

            Info = _info;

            //時刻として現在時刻を設定する
            Datetime = DateTime.Now;
        }

        public LogItem(Guid _id, string _text, LogType _type, string _source, Info _info)
        {
            Id = _id;
            Text = _text;
            Type = _type;

            Source = _source;
            Info = _info;

            //時刻として現在時刻を設定する
            Datetime = DateTime.Now;
        }

        //識別子
        public Guid Id { get; private set; }
        //文言
        public string Text { get; private set; }
        //種類
        public LogType Type { get; private set; }

        //発生源
        public string Source { get; private set; }
        //付随情報
        public Info Info { get; private set; }

        //時刻
        public DateTime Datetime { get; private set; }
    }

    //運用記録の種類
    public enum LogType
    {
        //重大
        Critical,
        //過誤
        Error,
        //警告
        Warning,
        //情報
        Information,
        //詳細
        Verbose
    }

    //情報
    //任意の情報を保持する用途で使用する
    public class Info : Dictionary<string, object> { }
```