在我们的C#应用中,我们将文件写入Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
。我们的log4net日志文件也应该去那里,所以我们定义了application.conf
如下:
<appender name="LogFile" type="log4net.Appender.RollingFileAppender">
<appendToFile value="true"/>
<file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>
...snip...
</appender>
这是有效的,直到我们在具有非英语Windows的PC上运行。因此,SpecialFolder.MyDocuments
指向文件夹Mijn Documenten
,而日志仍然转到My Documents
。随之而来的是混乱,因为现在我们的档案分布在两个地方。
我想将我的日志写入“真正的”我的文档文件夹。我该怎么做?
%USERPROFILE%
这样的环境变量,但似乎没有“我的文档”存在。application.conf
访问。我试图以编程方式覆盖我的appender的File
参数,如下所示:
public static void ConfigureLogger()
{
XmlConfigurator.Configure();
Hierarchy hierarchy = (Hierarchy)log4net.LogManager.GetRepository();
foreach (var appender in hierarchy.Root.Appenders)
{
if (appender is FileAppender)
{
var fileAppender = appender as FileAppender;
var logDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyApp");
var pathElements = fileAppender.File.Split(Path.DirectorySeparatorChar);
var logFileName = pathElements.Last();
var fullLogFilePath = Path.Combine(logDirectory, logFileName);
fileAppender.File = fullLogFilePath;
}
}
}
这也不起作用:当我检查记录器的内部时,File
属性会愉快地报告Mijn Documenten
,但同时日志仍会转到My Documents
。
我的想法已经用完了!
答案 0 :(得分:10)
更改行
<file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>
到
<file type="log4net.Util.PatternString" value="%envFolderPath{MyDocuments}\MyApp\log.txt" />
答案 1 :(得分:1)
似乎至少有两种方法。最简单的是一种黑客攻击:
指定自定义环境变量以指示log4net配置中的根路径:
<file value="%MYAPP_USER_ROOTFOLDER%\MyApp\log.txt"/>
在启动时,在初始化日志记录之前,请设置此环境变量值:
Environment.SetEnvironmentVariable("MYAPP_USER_ROOTFOLDER", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
这里解释了更复杂但推荐的方法:http://marc.info/?l=log4net-user&m=110142086820117&w=2和http://ziqbalbh.com/articles/log4net-another-way-to-change-log-file-location-on-runtime/
答案 2 :(得分:1)
接受的答案已过时。
您现在应该使用:
<file value="${UserProfile}\Documents\log-messages.log" />
(这应该适用于Windows 7,其中&#34;文档&#34;由别名引用&#34;我的文档&#34;。)
${UserProfile}
将映射到C:\ Users [UserName],即使您未在环境变量列表中看到此变量明确定义。