その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で行っている処理は下記します】
こうすることで、
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://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>
WPF+単一EXEはいろいろと難しいですが、頑張っていきましょー!