log4net没有正确PatternString替换我的登录名.我想要我的日志
日志\ YYYYMMDD\MSMQcore_ [用户名]的.log
当我使用该%username属性时,我在路径中获取域,这会在其中添加另一个文件夹间接.我只想要用户名.
日志\ YYYYMMDD\MSMQcore_ [域]\[用户名]的.log
任何人都有一个在appender的文件名中插入"用户名"的例子?我尝试了很多东西,我还在摸不着头脑.
<appender name="core_Appender" type="log4net.Appender.RollingFileAppender" >
<!-- <file type="log4net.Util.PatternString" value="Logs/%date{yyyyMMdd}/MSMQcore_%identity.log" /> -->
<!-- <file type="log4net.Util.PatternString" value="Logs/%date{yyyyMMdd}/MSMQcore_%property{user}.log" /> -->
<file type="log4net.Util.PatternString" value="Logs/%date{yyyyMMdd}/MSMQcore_%username.log" />
</appender>
Run Code Online (Sandbox Code Playgroud)
使用环境变量模式对我有用:
<file type="log4net.Util.PatternString" value="Logs\\%env{USERNAME}.txt" />
Run Code Online (Sandbox Code Playgroud)
更新:如果USERNAME环境变量不是选项,则可以替代子类化PatternString.这是一个简单的实现:
public class MyPatternString : PatternString
{
public MyPatternString()
{
AddConverter("usernameonly", typeof(UserNameOnlyConverter));
}
}
public class UserNameOnlyConverter : PatternConverter
{
override protected void Convert(TextWriter writer, object state)
{
var windowsIdentity = WindowsIdentity.GetCurrent();
if (windowsIdentity != null && windowsIdentity.Name != null)
{
var name = windowsIdentity.Name.Split('\\')[1];
writer.Write(name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
新设置如下所示:
<file type="MyPatternString" value="Logs\\%usernameonly.txt" />
Run Code Online (Sandbox Code Playgroud)
更新2:回答为什么%identity和%property {user}不起作用:
%identity模式选取当前线程上的identity属性.这个属性在我的测试中为null,可能是这样,直到为运行的线程分配一个特定的Windows标识.这在appender的上下文中不起作用,因为您不知道哪个线程将执行实际的附加.
%属性模式从GlobalContext和ThreadContext类中获取属性.默认情况下,仅在GlobalContext中注册log4net:HostName(LoggingEvent.HostNameProperty).因此,除非您在这些上下文中主动注册属性,否则不能将它们与%属性模式一起使用.同样,ThreadContext在appender的上下文中是无用的,因为你无法知道哪个线程将执行追加.
也就是说,在应用程序启动例程中的某个地方注册GlobalContext.Properties集合中名为username的属性,将使%property {username}能够按预期工作.
| 归档时间: |
|
| 查看次数: |
12800 次 |
| 最近记录: |