Log4net не работает

Привет, у меня есть эта конфигурация в моем web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

но log4net не работает. Мой проект компилируется отлично, и я не получаю отладки ошибок. Строки, в которых я указываю log.debug("somemessage"), запускаются нормально, но я не могу найти файл mylog.log, так где это?

Ответ 1

Один из способов получения этого типа состоит в том, чтобы добавить атрибут XmlConfigurator к сборке, поместив следующую строку в свой AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

В противном случае log4net никогда не активируется.

Ответ 2

Я предполагаю, что либо log4net не регистрируется вообще, либо файл не заканчивается там, где вы ожидаете.

Во-первых, вы действительно назовете

XmlConfigurator.Configure()

где-нибудь в вашем коде? Если фрагмент xml выше находится в файле конфигурации приложения, этот вызов будет делать трюк. Если фрагмент xml находится в его собственном файле, вам нужно будет использовать перегрузку .Configure(string), которая берет путь к файлу. Без этого вызова (или, по-видимому, атрибута уровня сборки, упомянутого Kirk Woll), тогда log4net вообще не будет регистрироваться.

Если вы считаете, что все это сделано, и log4net должен регистрироваться, то, возможно, вы должны поместить полный путь для файла журнала при дальнейшей отладке. Это позволит вам быть уверенным, где должен быть файл.

Ответ 3

Существует еще одна небольшая ошибка, см. здесь: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

метод [assembly: log4net.Config.XmlConfigurator] не работает с app.config. Если вы настраиваете log4net из app.config, вы должны использовать метод log4net.Config.XmlConfigurator.Configure().

Ответ 4

Вот мой контрольный список, когда log4net оказывается непоколебимым:

  • убедитесь, что файл log4net.config скопирован в папку bin\при создании (установите в "Копировать, если новый" в компиляторе)
    • при работе с установленным кодом убедитесь, что log4net.config пришел для езды (установлен в "Content" в компиляторе)
  • убедитесь, что пользователь запускает процесс, так как имеет права на запись в папку, где должны записываться журналы
  • если есть сомнения, дайте беспорядочные разрешения для c:\temp\и получите все, чтобы войти туда()
  • запустите Sysinternal/Dbgview.exe, чтобы узнать, что это вам говорит.

Ответ 5

Это шаги, которые в конечном итоге заставили работать мой журнал:

  • -Check AssemblyInfo.cs содержит следующий атрибут.   [сборка: log4net.Config.XmlConfigurator]. Это загружает log4net.
  • Проверить, что в каталоге журнала есть права на запись.
  • Проверить, что журнал имеет указанный формат. Это делается путем проверки каждого элемента в вашей конфигурации с указанным элементом макет. Например:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Наконец, попробуйте включить внутреннее ведение журнала log4net, чтобы включить ведение журнала консоли и проверку консоли. Для этого добавьте <add key="log4net.Internal.Debug" value="true"/> к вашему appSettings.

Ответ 6

Для проекта ASP.NET MVC добавление

log4net.Config.XmlConfigurator.Configure();

Global.asax.cs также помогает:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}

Ответ 7

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

Итак, если файл не создан на диске, начните с , глядя в разрешения файловой системы, чтобы убедиться, что пользователь, на котором работает ваше приложение, может записать новый файл на этот диск.

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

Ответ 8

Я перепробовал все вышеперечисленное, но ничего не получалось. Добавление этой строки в разделе configSections в app.config работало для меня.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Убедитесь, что Version и PublicKeyToken верны

Ответ 9

<param name="File" value="mylog.log" />

говорит "напишите mylog.log в фактическую папку". Это означает, что если ваш webapp находится под IIS, тогда журнал будет записан в C:\inetpub\wwwroot\appname\mylog.log.

Если файл журнала отсутствует, возможно, учетная запись, под которой работает приложение, не имеет права на запись в папку. Вы можете запустить Process Monitor из SysInternals, чтобы узнать, где и где написан файл.

Также запустите VS в режиме отладки, чтобы посмотреть, не выбрасываются ли какие-либо исключения (Debug- > Exceptions- > CLR Exceptions, Check Thrown).

Ответ 10

В моем случае я забываю установить свойства файла log4Net.config как "Содержимое", чтобы файл не был включен в развертывание. Поэтому обратите на это внимание:

Compile action : Content

Ответ 11

К сожалению, ничего из вышеперечисленного не помогло. Явная конфигурация в классе, которую нужно зарегистрировать в дополнение к предыдущим предложениям по настройке, сделала мое дело.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

Ответ 12

Также через несколько часов я понял, почему он не работает для меня...

у меня было:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

но это должно быть:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Итак, убедитесь, что ILog находится на первой строке....