如何使用log4net登录每个线程的单独日志文件

时间:2012-03-08 18:38:51

标签: .net multithreading logging log4net

是的,这个问题类似于: How to log into separate files per thread with Log4Net?  除了我在运行时之前不知道线程数或其名称。我的Windows应用程序为每个用户生成一个线程,为该用户执行长时间运行的工作。我想为每个用户/线程提供一个单独的日志文件。

  1. log4net配置文件的外观如何(如果可以用于此类事件)?
  2. 使用记录器的代码是什么样的?
  3. 我何时会致电log4net.Config.XmlConfigurator.Configure()?
  4. (请详细说明如何实施日志记录。)

    这是一个示例配置(我无法使用thread_name属性来处理多个线程):

    <log4net debug="false">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--need to replace LogDir in code like this:  log4net.GlobalContext.Properties["LogDir"] = "c:\programdata\myapp"-->
      <file type="log4net.Util.PatternString" value="%property{LogDir}\logs\mylogfile_%property{thread_name}.log" />
      ...
    

    代码:

    public class MyMultiThreadedClassForUsers
    {
        private log4net.ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public void Start()
        {
            log4net.GlobalContext.Properties("LogDir") = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)        
            log4net.Config.XmlConfigurator.Configure()
    
            List<IUser> users = GetAllUsersFromDB();
    
            foreach (IUser user in users) {
                System.Threading.Thread t = new System.Threading.Thread(CallBackMethod);
                t.Name = user.FirstName;
                t.Start();
            }
        }
    
        private void CallBackMethod()
        {
            // this log message should be sent to a log file named after the current thread System.Threading.Thread.CurrentThread.Name
            // Examples: mylogfile_bob.log, and mylogfile_fred.log, etc...
            Log.Info("Starting work on thread " + System.Threading.Thread.CurrentThread.Name);
    
            // do long running work here
        }
    }
    

    如果用log4net不能轻易完成,我可以将日志框架切换到Nlog,并使用%threadname关键字作为日志文件名的一部分,该文件名存储在配置文件中。

1 个答案:

答案 0 :(得分:1)

请试试这个:

  

http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

     

如果您需要使用log4net生成动态日志文件名,那么您   可以使用以下配置

<appender name="RollingFileAppenderV1" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="F:\HornetFeed\%property{LogName}" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  ...
  <filter type="log4net.Filter.PropertyFilter">
    <Key value="Version" />
    <StringToMatch value="1" />
    ...
    <= Note the "%property{LogName}" syntax
     

请注意%property {LogName}这是我们可以使用的log4net属性   使用C#代码在运行时设置。

log4net.GlobalContext.Properties["LogName"] = "file1.log";
     

请记住在实例化之前设置GlobalContext属性   log4net记录器。即在此电话会议之前:

log4net.ILog log = LogManager.GetLogger(typeof(Program));
     

然后:

  ///Helper method to log errors:
  internal static void LogError(Exception ex)
  {
    string state = "1";
    if (log4net.ThreadContext.Properties["Version"] != null)
      state = log4net.ThreadContext.Properties["Version"].ToString();
    log4net.ThreadContext.Properties["Version"] = "0";
    logger.HandleException(ex, "Error");
    log4net.ThreadContext.Properties["Version"] = state;
  }

'希望有所帮助