log4net 在作为 ClickOnce winforms 应用程序发布后不记录
log4net not logging after release as ClickOnce winforms application
我构建了一个包含两个项目的应用程序 - 一个 Windows Forms 项目和一个包含我的自定义控件的 class 库。我已将 log4net 添加到 class 库中,并在 log4net.config 文件中使用此配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="${TMP}\log-file.txt" />
<appendToFile value="true" />
<encoding value="unicodeFFFE" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
该文件将“生成操作”设置为“内容”,将“复制到输出目录”设置为“始终复制”。在 AssemblyInfo.cs:
[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
我这样使用控件中的记录器:
using System;
using System.Windows.Forms;
using log4net;
namespace ControlProject
{
public partial class MyControl : UserControl
{
private readonly ILog log;
public MyControl()
{
InitializeComponent();
log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
private void logButton_Click(object sender, EventArgs e)
{
log.Info("Log something");
}
}
}
现在这一切都很好,并且在使用 Visual Studio 时工作正常(此配置在调试和发布模式下都有效)。但是一旦我发布 Windows Forms 项目,日志记录就不会再发生了。当我从 Visual Studio 附加到应用程序时,我可以看到日志配置不正确 - 没有附加程序。我 运行 不知道该怎么办。我尝试干预配置(App.config、log4net.config),尝试添加这一行:
XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));
我也尝试添加这个装饰器来确保日志初始化方法没有被优化掉:
[MethodImpl(MethodImplOptions.NoInlining)]
有人可以告诉我如何让它工作吗?
当您通过 ClickOnce 部署 winform 应用程序时,您需要注意几件事。
保存log4net.config文件的位置
点击一次,此文件无法访问。您可能想将此文件放在公共文件夹(MyDocuments / AppData 等)中,并在应用程序启动时以编程方式重新配置 log4net。
日志文件写到哪里
日志文件也是如此。日志文件不可访问,ClickOnce 应用程序将转到每个版本的新文件夹。您需要将日志文件写入一个公共位置(如 MyDocuments / AppData 文件夹)。在应用程序启动时,您需要加载所有附加程序并将它们重新配置为指向新的日志位置。
下面的link可能对您有所帮助
我构建了一个包含两个项目的应用程序 - 一个 Windows Forms 项目和一个包含我的自定义控件的 class 库。我已将 log4net 添加到 class 库中,并在 log4net.config 文件中使用此配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="${TMP}\log-file.txt" />
<appendToFile value="true" />
<encoding value="unicodeFFFE" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
该文件将“生成操作”设置为“内容”,将“复制到输出目录”设置为“始终复制”。在 AssemblyInfo.cs:
[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
我这样使用控件中的记录器:
using System;
using System.Windows.Forms;
using log4net;
namespace ControlProject
{
public partial class MyControl : UserControl
{
private readonly ILog log;
public MyControl()
{
InitializeComponent();
log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
private void logButton_Click(object sender, EventArgs e)
{
log.Info("Log something");
}
}
}
现在这一切都很好,并且在使用 Visual Studio 时工作正常(此配置在调试和发布模式下都有效)。但是一旦我发布 Windows Forms 项目,日志记录就不会再发生了。当我从 Visual Studio 附加到应用程序时,我可以看到日志配置不正确 - 没有附加程序。我 运行 不知道该怎么办。我尝试干预配置(App.config、log4net.config),尝试添加这一行:
XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));
我也尝试添加这个装饰器来确保日志初始化方法没有被优化掉:
[MethodImpl(MethodImplOptions.NoInlining)]
有人可以告诉我如何让它工作吗?
当您通过 ClickOnce 部署 winform 应用程序时,您需要注意几件事。
保存log4net.config文件的位置
点击一次,此文件无法访问。您可能想将此文件放在公共文件夹(MyDocuments / AppData 等)中,并在应用程序启动时以编程方式重新配置 log4net。
日志文件写到哪里
日志文件也是如此。日志文件不可访问,ClickOnce 应用程序将转到每个版本的新文件夹。您需要将日志文件写入一个公共位置(如 MyDocuments / AppData 文件夹)。在应用程序启动时,您需要加载所有附加程序并将它们重新配置为指向新的日志位置。
下面的link可能对您有所帮助