我有一个使用log4net进行日志记录的内部应用程序。我希望在%LOCALAPPDATA%\Vendor\App\application.log
生成日志。不幸的是,log4net正在%APPDATA%
创建日志文件。这不是一个大问题,因为我们真的不在这里使用漫游配置文件,但我不喜欢在我的代码中留下一些特质,如果我可以避免它。
有关如何将文件写入我指定的位置而不用编程配置log4net并使用pinvoke获取XP路径的任何想法?
如果有任何帮助,这是配置文件的appender部分:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="${LOCALAPPDATA}\Vendor\App\application.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger%newline%message%newline" />
</layout>
</appender>
答案 0 :(得分:8)
如果这不起作用,则意味着您的环境变量是错误的。
Log4net没有任何特殊功能来处理appdata或localappdata。它所做的只是调用System.Environment.GetEnvironmentVariables()来返回一个哈希表,并根据返回的值执行替换。
答案 1 :(得分:4)
在这里参加聚会很晚,但是我碰到了这个,找到了答案。
似乎可以使用log4net.Util.PatternString将环境变量插入文件路径。因此,OP的示例变为:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\Vendor\App\application.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger%newline%message%newline" />
</layout>
</appender>
在文件元素中添加 type =“ log4net.Util.PatternString” ,然后指定%env 模式说明符,然后在大括号中指定环境变量名称。< / p>
希望这对某人有帮助!
答案 2 :(得分:0)
对每个人来说,都有和我一样的问题:
这可以为您提供本地应用程序数据或所需的任何环境变量路径。使用小写字母,例如“ localappdata”!找不到它时返回Empty.string。
private static string GetLocalAppDataPath()
{
foreach (DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables())
{
var environmentVariableString = environmentVariable.Key as string;
if (environmentVariableString?.ToLower() == "localappdata")
return (string) environmentVariable.Value;
}
return string.Empty;
}