2015-03-24 2 views
1

У меня есть следующий код, который записывает все очень красиво. Должен ли я добавить это в конструктор всех моих классов?Конфигурирование Log4Net для полного проекта

Есть ли способ настроить его для полного проекта? Полагаю, я мог бы обходить журналы во всех классах, но это швы вроде беспорядочного решения.

class Program 
{ 
    /// <summary> 
    /// Application start 
    /// <param name="settings"></param> 
    /// <returns></returns> 
    static int Main(string[] args) 
    { 
    string logFile = string.Format(@"{0}\Cloud\Cloud.Log", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 
    log4net.GlobalContext.Properties["LogFileName"] = logFile; 
    log4net.Config.XmlConfigurator.Configure(); 
    ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
    log.Info("Console Applicatin Start"); 
    } 
} 

Как я могу настроить Log4Net для полного решения?

Я не думаю, что это имеет отношение к вопросу, но вот мой мой App.config:

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="250KB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 
    </log4net> 
+0

Любая причина для не используя app.config для конфигурации? – FishySwede

+0

Ну, у меня также есть конфиг приложения, я добавил его к вопросу, который я не думал, что это имеет значение. Это мой первый раз, используя Log4net. Причина для -1? – DaImTo

+0

-1 я не был, не знаю, почему кто-то проголосовал. – FishySwede

ответ

1

Одной из замечательных особенностей log4net является возможность настроить фильтрацию и обработку по-разному в зависимости от имени журнала: любое решение, которое обертывает логгер в оболочке, одиночном или статическом объекте, теряет, что, поскольку все журналы будут использовать один и тот же журнал имя - и полезная возможность сразу увидеть, из какого класса появилась запись в журнале.

Все, что вам нужно в классе, где вы хотите войти в поле, например:.

private static ILog Log =   
      LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

, который задает имя регистратора с именем типа он содержится в

+0

Вы правы, я уже думал об этом. – DaImTo

1

Я обычно использую класс-оболочку. Что-то вроде:

public class Logger 
{ 
    private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(typeof(Logger)); 

    static Logger() 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 

    public void Error(string format, params object[] args) 
    { 
     _log.Error(string.Format(format, args)); 
    } 

    //... 
} 

А затем просто создайте экземпляр, где мне это нужно. Как:

private Logger _log = new Logger(); 

, а также использовать его как:

_log.Error("Something went wrong, Exception: {0}, More parameters: {1}", 
    e.Message, "Another parameter"); 

log4net.Config.XmlConfigurator.Configure(); 

Если настроить log4net в соответствии с вашими app.config.

Edit:

Я думал, что после моего log4net конфигурации, в случае, если вы хотите попробовать один, что было подтверждено работать. Она устанавливает файл регистратор и консольный регистратор (полезный для просмотра журнальной среды разработки я):

<log4net> 
    <root> 
    <level value="ALL" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="DebugFileLogger" /> 
    </root> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger: %message%newline" /> 
    </layout> 
    </appender> 
    <appender name="DebugFileLogger" type="log4net.Appender.RollingFileAppender"> 
    <param name="File" value="Logs/DebugLog.log" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="20MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d%t %m%n" /> 
    </layout> 
    </appender> 
</log4net> 
+0

Я играю с этим сейчас. Мой app.config работает. Я использую , потому что мне нужно его сохранить файл журнала в каталоге% programdata% для моего приложения. – DaImTo

+0

Это имеет смысл. Убедитесь, что у вас есть права на запись в этот каталог. Это должно быть очень полезно в следующих ситуациях: http://stackoverflow.com/questions/756125/how-to-track-down-log4net-problems – FishySwede

+0

Что такое, params object [] args for? – DaImTo

1

Решения, которое я вижу чаще, это создать LogManager класс, и свойство в каждом классе извлекающей экземпляр регистратору, так что это только строки кода, необходимого в каждом классе, чтобы получить регистратор:

private ILog _log; 

public ILog Log 
{ 
    get { return _log ?? (_log = LogManager.GetLogger(LogName.WebServices)); } 
} 

LogName.WebServices является значение Enum, и должна быть расширена с более значений, так что вы можете отфильтровать ваши журналы еще больше.

Смежные вопросы