いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

.net Core 3.1 の NLogではまった… その3

2020年06月09日 14時59分10秒 | .NET系
その1:https://blog.goo.ne.jp/pianyi/e/63d643b66739ea286e74bac9b39b5c2a
その2:https://blog.goo.ne.jp/pianyi/e/edf5b129ab13a7cef41c86880d6efd62
その3:https://blog.goo.ne.jp/pianyi/e/9b6017142366df6ed30ec21f6402511a

【.net Core 3.1 の NLogではまった… その2】 で、「単一ファイルの作成」 で作ったEXEファイルを実行すると、ログファイルの出力先指定が変わってしまう問題を解決しました。

上記その2と同じように、NLog.config ファイルはどのファイルを参照するのでしょうか…?
答えは、TmpフォルダにあるNLog.config を参照します。

そのため、不具合が発生した際、エンドユーザ「ログをDebugにして再現させて、そのログ下さい」が簡単には言えません。
下記URL記事にもありますが、パスが面倒です。
場所:C:\Users\{ユーザ名}\AppData\Local\Temp\.net\TestProject\{ランダムな文字列}\NLog.config
https://rksoftware.hatenablog.com/entry/2019/09/29/155926

というわけで、アプリケーション起動時にNLog.config ファイルの読み込み先変更処理を追加しておきます。
WPFのMVVMはまだ苦手です…
ファイル:App.xaml.cs (App.xaml) のサンプル【実際にPrismで行っている処理は下記します】
private void Application_Startup(object sender, StartupEventArgs e)
{
    if (File.Exists("./nlog.config")) {

        // ログファイルが存在する場合は指定する
        LogManager.Configuration = new XmlLoggingConfiguration("./nlog.config");
    }
    Logger logger = LogManager.GetCurrentClassLogger();
}



こうすることで、
1.デフォルトではEXEに埋め込まれた、NLog.config ファイルを読み込みファイルを出力する。
2.EXEと同じ個所にNLog.configファイルが存在する場合はそれを読み込む

という流れが出来ます。

Debugにしてほしい時は、nlog.config ファイルをEXEと同じ場所においてもらえば良いわけですね。


これで .netCore 3.1 と Nlog を使って 「単一ファイルの作成」 で.NetFramework の時と同じログ出力を行う事が出来ます。
さらに配布が楽!

良いのだか悪いのだか…
とりあえず解決っ!

今回思ったこと…今までは可能な限りフルパス(${basedir} や Assembly.FullName でパス取得)で指定していたが、
今後は可能な限り【参照パス】を使った方が良いと思われます。
以上!!疲れた!


検索用:.net Core 3.1 NLog 単一ファイルの作成 NLog.config どこ 場所が分からない 場所指定 ない 変更 反映されない Debug 出力

Prismを利用したソースコード【実物】:
public partial class App : PrismApplication
{
    private const string NLogConfigFile = "./nlog.config";
    private readonly Logger Logger;

    public App() : base()
    {
        InitializeComponent();

        // ログ情報変更
        SetLogConfig();
        Logger = LogManager.GetCurrentClassLogger();
    }

    private void SetLogConfig()
    {
        // ログ情報の指定
        if (File.Exists(NLogConfigFile))
        {
            // ログファイルが存在する場合は指定する
            LogManager.Configuration = new XmlLoggingConfiguration(NLogConfigFile);
        }

        var logger = LogManager.GetLogger("LogFile");
        logger.Factory.Configuration.Variables.Add("CompanyName", Constants.CompanyName);
        logger.Factory.Configuration.Variables.Add("AssemblyName", Constants.ApplicationName);
        logger.Factory.ReconfigExistingLoggers();
    }

    // その他いろいろな処理
}


NLog.config の設定【実物】:
<targets async="true">
  <!-- VS の出力ウィンドウに出すには Debugger に変わった -->
  <target xsi:type="Debugger" name="LogConsole" layout="${longdate} [${threadid:padding=8}] [${uppercase:${level:padding=-5}}] ${message} ${exception:format=Message, Type, ToString:separator=\r\n}" />

  <!-- ファイル出力+ローテーション -->
  <target
    xsi:type="File"
    name="LogFile"
    fileName="${specialfolder:folder=CommonApplicationData}/${var:CompanyName}/${var:AssemblyName}/logs/${var:AssemblyName}.log"
    encoding="UTF-8"
    lineEnding="CRLF"
    archiveFileName="${specialfolder:folder=CommonApplicationData}/${var:CompanyName}/${var:AssemblyName}/logs/${var:AssemblyName}_{#}.zip"
    archiveEvery="Day"
    archiveNumbering="DateAndSequence"
    archiveDateFormat="yyyyMMdd"
    archiveAboveSize="10485760"
    maxArchiveFiles="100"
    enableArchiveFileCompression="true"
    layout="${longdate} [${threadid:padding=8}] [${uppercase:${level:padding=-5}}] ${message} ${exception:format=Message, Type, ToString:separator=\r\n}" />
</targets>
<rules>
    <!-- ログ出力先の指定 -->
    <logger name="*" minlevel="Debug" writeTo="LogConsole" />
    <logger name="*" minlevel="Info" writeTo="LogFile" />
</rules>

コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« .net Core 3.1 の NLogではま... | トップ | .net Core 3.1 は まだ早かっ... »

2 コメント

コメント日が  古い順  |   新しい順
Unknown (Fさん)
2021-01-28 16:40:41
すごっく助かりました。ありがとうございました。
返信する
Unknown (管理人)
2021-02-05 15:08:45
お役に立てたようで良かったです♪
WPF+単一EXEはいろいろと難しいですが、頑張っていきましょー!
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

.NET系」カテゴリの最新記事