.net Core 3.1 の NLogではまった… その3
その1:https://deathmarchdaily.blogspot.com/2020/06/net-core-31-nlog.html
その2:https://deathmarchdaily.blogspot.com/2020/06/net-core-31-nlog-2.html
その3:https://deathmarchdaily.blogspot.com/2020/06/net-core-31-nlog-3.html
【.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で行っている処理は下記します】
こうすることで、
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を利用したソースコード【実物】:
NLog.config の設定【実物】:
その2:https://deathmarchdaily.blogspot.com/2020/06/net-core-31-nlog-2.html
その3:https://deathmarchdaily.blogspot.com/2020/06/net-core-31-nlog-3.html
【.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>
コメント
コメントを投稿