DioDocs for Excel
DioDocs for Excel
ロギング
機能 > ロギング

DioDocs for Excelでは、ロギング機能を使用して、ログを出力し、根本原因を突き止めることで問題を解決することができます。また、JSONファイルの構成に基づいて、debug(デバッグ)、error(エラー)、warn(警告)、info(情報)などのさまざまなログレベルを保存できます。

DioDocs for Excelは、他の外部ライブラリとともにMicrosoft.Extensions.Loggingライブラリを使用してロギング機能を実装します。ロギング情報は、JsonとExcelのインポート/エクスポート、およびPDFエクスポートでサポートされます。ロギング機能はデフォルトで無効になっています。有効にするには、アプリケーションまたはWebサイトを初期化するときにWorkbook.LoggerFactoryプロパティを設定します。詳細については、以下のセクションを参照してください。

ロギング機能の有効化

次は、DioDocs for Excelではロギング機能を有効にする手順を示します。ログはコンソールに出力され、ファイルに保存されます。

  1. 新しいコンソールアプリケーションを作成し、次のnugetパッケージをインストールします。
    • Microsoft.Extensions.Logging.Console
    • Microsoft.Extensions.Configuration.Json
    • Serilog.Extensions.Logging.File
    • .NETFrameworkを対象としている場合は、Microsoft.Extensions.Logging.Abstractionsをインストールする必要があります。

  2. ロガーファクトリを作成する方法については、次のサンプルコードを参照してください。
    C#
    コードのコピー
    private static ILoggerFactory CreateLoggerFactory()
    {
        var builder = new ConfigurationBuilder().
            SetBasePath(Directory.GetCurrentDirectory()).
            AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        var cfgRoot = builder.Build();
        var loggingCfg = cfgRoot.GetSection("Logging");
        var factory = LoggerFactory.Create(
            logBuilder => logBuilder.AddConfiguration(loggingCfg).AddConsole());
        factory.AddFile(loggingCfg);
        return factory;
    }
    

  3. ロガーファクトリをワークブックに添付する方法については、次のサンプルコードを参照してください。
    C#
    コードのコピー
    static void Main(string[] args)
    {
        using (var loggerFactory = CreateLoggerFactory())
        {
            Workbook.LoggerFactory = loggerFactory;
            var wb = new Workbook();
            try
            {
                wb.Save("test.pdf");
            }
            catch (Exception)
            { }
        }
    }
    

  4. プロジェクトに新しいjsonファイルを作成し、「appsettings.json」という名前を設定します。[プロパティ]ウィンドウから「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定します。 ファイルがすでに存在する場合は、そのコンテンツを既存のファイルおよびappsettings.development.jsonとマージします。詳細については、「Serilogファイルログの構成(英語版)」を参照することもできます。

       
  5. 以下の設定をappsettings.jsonファイルに追加します。
    JSON
    コードのコピー
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information"
        },
        "PathFormat": "log-{Date}.txt"
      }
    }
    

  6. プロジェクトを実行すると、ログはコンソールに出力して、「log-yyyyMMdd.txt」ログファイルに保存します。


ログレベルの設定

DioDocs for Excelでは、デバッグ、情報、警告、エラーの4つのログレベルを設定できます。それらの優先順位は次のとおりです。

デバッグ < 情報 < 警告 < エラー

ログファイルに出力するログレベルを構成できます。ログレベルを設定すると、これより上位または同じのログレベルのメッセージが出力されたログに含まれ、優先度が低いログは無視されます。たとえば、ログレベルを「情報」に設定すると、情報、警告、およびエラーのログが出力されるが、デバッグは無視されます。

appsettings.jsonでデフォルトのログレベルを「警告」に設定し、DioDocs for Excelのログレベルを「情報」に設定する方法については、次のサンプルコードを参照してください。

JSON
コードのコピー
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "GrapeCity.Documents.Excel": "Information"
    }
  }
}

コンソール出力でDioDocs for Excelのログレベルを「情報」に設定する方法については、次のサンプルコードを参照してください。

JSON
コードのコピー
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    },
    "Console": {
      "LogLevel": {
        "GrapeCity.Documents.Excel": "Information"
      }
    }
  }
}

詳細については、「.NET Core および ASP.NET Core でのログ記録」を参照してください。


スレッドIDを持つログ記録の保存

ログファイルにログとともにスレッドIDを表示することもできます。これは、特定のプロセスまたは問題を引き起こしているスレッドを分析するために役立ちます。appsettingsファイルは、Microsoft.Extensions.Logging形式を使用してログを生成します。

メモ:この例では、型読み込みエラーを報告するserilog-settings-configurationが使用されません。

スレッドIDを持つログ記録を保存する方法については、次の手順を参照してください。

  1. 以下のnugetパッケージをインストールします。
    • Microsoft.Extensions.Configuration.Json
    • Microsoft.Extensions.Logging
    • Microsoft.Extensions.Logging.Configuration
    • Serilog.Enrichers.Thread
    • Serilog.Extensions.Logging
    • Serilog.Sinks.RollingFil
    • .NETFrameworkを対象としている場合は、Microsoft.Extensions.Logging.Abstractionsをインストールする必要があります。

  2. ロガーファクトリを作成するメソッドを記述する方法については、次のサンプルコードを参照してください。
    C#
    コードのコピー
    private static ILoggerFactory CreateLoggerFactory()
    {
        var appSettings = new ConfigurationBuilder().
        SetBasePath(Directory.GetCurrentDirectory()).
        AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).
        Build();
        var loggingSection = appSettings.GetSection("Logging");
        var serilogConfig = new LoggerConfiguration();
        ConfigureSerilog(loggingSection, serilogConfig);
        var factory = new LoggerFactory();
        factory.AddSerilog(serilogConfig.CreateLogger());
        return factory;
    }
     
    private static void ConfigureSerilog(IConfigurationSection loggingSection,
                                         LoggerConfiguration loggerCfg)
    {
        loggerCfg.Enrich.WithThreadId();
        string pathFormat = loggingSection["PathFormat"];
        string outputTemplate = loggingSection["OutputTemplate"];
        loggerCfg.WriteTo.RollingFile(pathFormat, outputTemplate: outputTemplate);
        ConfigureMinLevel(loggerCfg.MinimumLevel, loggingSection);
    }
     
    private static void ConfigureMinLevel(LoggerMinimumLevelConfiguration minimumLevel,
                                          IConfigurationSection loggingCfgSection)
    {
        var logLevelSection = loggingCfgSection.GetSection("LogLevel");
        int pathLength = logLevelSection.Path.Length;
        foreach (var logItem in logLevelSection.AsEnumerable())
        {
            if (logItem.Key.Length <= pathLength)
            {
                continue;
            }
            string name = logItem.Key.Substring(pathLength + 1);
            if (Enum.TryParse(logItem.Value, ignoreCase: true, out LogLevel level))
            {
                var serilogLevel = (LogEventLevel)level;
                if (name == "Default")
                {
                    minimumLevel.Is(serilogLevel);
                }
                else
                {
                    minimumLevel.Override(name, serilogLevel);
                }
            }
        }
    }
    

  3. ロガーファクトリをワークブックに添付する方法については、次のサンプルコードを参照してください。
    C#
    コードのコピー
            static void Main(string[] args)
            {
               static void Main()
    {
                using (ILoggerFactory loggerFactory = CreateLoggerFactory())
                {
                    Workbook.LoggerFactory = loggerFactory;
                    Workbook wb = new Workbook();
                    try
                    {
                        wb.Save("test.pdf")
                    }
                    catch(Exception)
                    { }
                }
    }
            }
    

  4. プロジェクトに新しいjsonファイルを作成し、「appsettings.json」という名前を設定します。[プロパティ]ウィンドウから「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定します。ファイルがすでに存在する場合は、そのコンテンツを既存のファイルおよびappsettings.development.jsonとマージします。
    C#
    コードのコピー
    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning",
          "GrapeCity.Documents.Excel": "Debug"
        },
        "PathFormat": "log-{Date}.txt",
        "OutputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} (Thread {ThreadId}) [{Level}] {Message}{NewLine}{Exception}"
      }
    }
    

    上記のコードでは、
    「LogLevel」セクションには、Microsoft.Extensions.Loggingと同じスキーマがあります。
    「PathFormat」セクションは、ログファイルの名前を指定します。
    「OutputTemplate」セクションは、各ログ記録の形式を指定します。

  5. プロジェクトを実行します。ログはlog-yyyyMMdd.txtに保存され、出力は次のようになります。
    Text
    コードのコピー
    2020-09-10 11:44:30.566 +08:00 (Thread 1) [Debug] Save pdf of the workbook.
     2020-09-10 11:44:30.615 +08:00 (Thread 1) [Debug] Paginate Start(Workbook)
     2020-09-10 11:44:31.104 +08:00 (Thread 1) [Debug] GetDigitWidthOfDefaultStyle GraphicsType: Pdf
     2020-09-10 11:44:31.108 +08:00 (Thread 1) [Debug] GetDigitWidthOfDefaultStyle DefaultFont: "FontName = Calibri
     FontSize = 11
     Bold = False
     Italic = False
     ScreenWidth = 0
     PDFWidth = 5.5751953125
     "
     2020-09-10 11:44:31.161 +08:00 (Thread 1) [Debug] Count of print ranges: 0
     2020-09-10 11:44:31.161 +08:00 (Thread 1) [Debug] Paginate End(Workbook)
     2020-09-10 11:44:31.164 +08:00 (Thread 1) [Error] There is no content to print.