вторник, 13 апреля 2010 г.

Log4net: How to log messges to different log files

Для логгирования в шарповом проекте пользуюсь log4net , и все бы хорошо, но потребовалось, чтобы при обработки разных задании логи каждого задания сохранялись в свой лог ,причем имя задания (а следовательно и имя лога) формируется на runtime ,при этом поток сообщении не относящихся к этим заданиям все так же должен сыпаться в основной лог файл.

Предположим что мы используем несколько логеров для разных нужд:

var log1 = log4net.LogManager.GetLogger("Manage");
var log2 = log4net.LogManager.GetLogger("Requests");
var log3 = log4net.LogManager.GetLogger("Task");
var log4 = log4net.LogManager.GetLogger("Results");

Все логи кроме "Task" должны складываться в файл "all.log" ,а лог "Tasks" в файлы вида "task_.log".

Для того чтобы это работало нам нужно разделить поток сообщении от всех логгеров на два appender'а. Сделать это можно с помощью стандартных фильтров:

  
    
      
       ...
 
  
  
  
    
    
      
        ...
 
  
  
  
 
    
     
       
       
       
     

Т.е. в appender "all" мы пишем все кроме того что отправлено через логгер "tasks" ,а в appender "tasks" только то что через "tasks" и больше ничего (DenyAllFilter).

Но нам то еще надо чтобы имя лога менялось!

Для этого сделаем вот такой код по переключению:
var hierarchy = (Hierarchy)log4net.LogManager.GetRepository();
var rol = (RollingFileAppender)hierarchy.Root.GetAppender("task");
rol.File = Path.GetDirectoryName(rol.File)+string.Format(@"\task_{0}.log",taskname);
rol.ActivateOptions();

Комментариев нет: