no se puede hacer que log4net funcione with.net servicio de Windows


Tengo un servicio de windows con un app.config y a log4net.config.

app.config:

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net configSource="log4net.config" />

log4net.config:

<log4net>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="D:\Projects\Integration\Interface Module\bin\Logs\MyFirstLogger.log"/>
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="2" />
    <maximumFileSize value="1MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>
    </layout>
  </appender>

  <root>
    <level value="ALL" />
    <appender-ref ref="LogFileAppender" />
  </root>
</log4net>

He añadido esto en AssemblyInfo.cs también:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

Y en una de mis clases, tengo:

private readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Y

_log.Info(content);

He dado a todos los usuarios permisos completos a mi carpeta de registros.

Mi carpeta bin (desde la que se ejecuta el servicio) tiene tanto mi app.config como log4net.config.

Pero no se generó ningún archivo de registro. Qué ajustes hice ¿señorita?

Actualizado en 4-Marzo-2014

Si está utilizando un archivo de configuración separado como lo hice yo (log4net.config), recuerde establecer la configuración Copy to output directory en Copy always en el Explorador de soluciones

Author: Null Reference, 2013-05-06

11 answers

Por diseño Log4Net es

Fail-stop, queremos decir que log4net no lanzará excepciones inesperadas en tiempo de ejecución potencialmente causando que su aplicación se bloquee

Así que es muy difícil averiguar qué está causando el problema .

¿Cómo habilito la depuración interna de log4net?

DE FAQ - http://logging.apache.org/log4net/release/faq.html

  • La depuración interna también se puede habilitar configurando un valor en el archivo de configuración de la aplicación (no el archivo de configuración de log4net, a menos que los datos de configuración de log4net estén incrustados en archivo de configuración). La log4net.Interno.La configuración de la aplicación de depuración debe ser establezca el valor true. Por ejemplo:
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
            <appSettings>
                <add key="log4net.Internal.Debug" value="true"/>
            </appSettings> 
</configuration>

Esta configuración se lee inmediatamente al iniciar y hará que se emitan todos los mensajes de depuración interna.

  • . Para habilitar la depuración interna de log4net mediante programación, debe configurar el log4net.Útil.LogLog.InternalDebugging propiedad a true. Obviamente, cuanto antes se establezca, más depuración se producirá.

Así que aquí hay una clase personalizada que creé para log4Net-porque el archivo de configuración fue muy confuso que creé esta clase ayudante

  • puede iniciar tantos appender como necesite en las aplicaciones así que si un dll llama a otro dll ambos pueden iniciar appenders y ambos los anexos funcionarán.
  • también puedes cerrar el appender y (como en el caso de file appender) luego envíalo como un correo electrónico
Log4NetFileHelper log = new Log4NetFileHelper();
        log.Init(); //Initialize
        log.AddConsoleLogging(); //Add Console Logging
        log.AddFileLogging(Path.Combine(AssemblyDirectory, "BatchConsole.log")); 
        log.AddFileLogging(Path.Combine(AssemblyDirectory,"BatchConsole_error.log"),log4net.Core.Level.Error); 

Establezca esta propiedad en True log4net.Útil.LogLog.InternalDebugging = true;

public class Log4NetFileHelper
{
    private string  DEFAULT_LOG_FILENAME=string.Format("application_log_{0}.log",DateTime.Now.ToString("yyyyMMMdd_hhmm"));
    Logger root;
    public Log4NetFileHelper()
    {

    }

    public virtual void Init()
    {
        root = ((Hierarchy)LogManager.GetRepository()).Root;
        //root.AddAppender(GetConsoleAppender());
        //root.AddAppender(GetFileAppender(sFileName));
        root.Repository.Configured = true;
    }

    #region Public Helper Methods
    #region Console Logging
    public virtual void AddConsoleLogging()
    {
        ConsoleAppender C = GetConsoleAppender();
        AddConsoleLogging(C);
    }

    public virtual void AddConsoleLogging(ConsoleAppender C)
    {
        root.AddAppender(C);
    }
    #endregion

    #region File Logging
    public virtual FileAppender AddFileLogging()
    {
        return AddFileLogging(DEFAULT_LOG_FILENAME);
    }

    public virtual FileAppender AddFileLogging(string sFileFullPath)
    {
        return AddFileLogging(sFileFullPath, log4net.Core.Level.All);
    }

    public virtual FileAppender AddFileLogging(string sFileFullPath, log4net.Core.Level threshold)
    {
        return AddFileLogging(sFileFullPath, threshold,true);  
    }

    public virtual FileAppender AddFileLogging(string sFileFullPath, log4net.Core.Level threshold, bool bAppendfile)
    {
        FileAppender appender = GetFileAppender(sFileFullPath, threshold , bAppendfile);
        root.AddAppender(appender);
        return appender;
    }

    public virtual SmtpAppender AddSMTPLogging(string smtpHost, string From, string To, string CC, string subject, log4net.Core.Level threshhold)
    {
        SmtpAppender appender = GetSMTPAppender(smtpHost, From, To, CC, subject, threshhold);
         root.AddAppender(appender);
         return appender;
    }

    #endregion


    public log4net.Appender.IAppender GetLogAppender(string AppenderName)
    {
        AppenderCollection ac = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Appenders;

        foreach(log4net.Appender.IAppender appender in ac){
            if (appender.Name == AppenderName)
            {
                return appender;
            }
        }

        return null;
    }

    public void CloseAppender(string AppenderName)
    {
        log4net.Appender.IAppender appender = GetLogAppender(AppenderName);
        CloseAppender(appender);
    }

    private void CloseAppender(log4net.Appender.IAppender appender)
    {
        appender.Close();
    }

    #endregion

    #region Private Methods

    private SmtpAppender GetSMTPAppender(string smtpHost, string From, string To, string CC, string subject, log4net.Core.Level threshhold)
    {
        SmtpAppender lAppender = new SmtpAppender();
        lAppender.Cc = CC;
        lAppender.To = To;
        lAppender.From = From;
        lAppender.SmtpHost = smtpHost;
        lAppender.Subject = subject;
        lAppender.BufferSize = 512;
        lAppender.Lossy = false;
        lAppender.Layout = new
        log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");
        lAppender.Threshold = threshhold;
        lAppender.ActivateOptions();
        return lAppender;
    }

    private ConsoleAppender GetConsoleAppender()
    {
        ConsoleAppender lAppender = new ConsoleAppender();
        lAppender.Name = "Console";
        lAppender.Layout = new 
        log4net.Layout.PatternLayout(" %message %n");
        lAppender.Threshold = log4net.Core.Level.All;
        lAppender.ActivateOptions();
        return lAppender;
    } 
    /// <summary>
    /// DETAILED Logging 
    /// log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");
    ///  
    /// </summary>
    /// <param name="sFileName"></param>
    /// <param name="threshhold"></param>
    /// <returns></returns>
    private FileAppender GetFileAppender(string sFileName , log4net.Core.Level threshhold ,bool bFileAppend)
    {
        FileAppender lAppender = new FileAppender();
        lAppender.Name = sFileName;
        lAppender.AppendToFile = bFileAppend;
        lAppender.File = sFileName;
        lAppender.Layout = new 
        log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");
        lAppender.Threshold = threshhold;
        lAppender.ActivateOptions();
        return lAppender;
    }

    //private FileAppender GetFileAppender(string sFileName)
    //{
    //    return GetFileAppender(sFileName, log4net.Core.Level.All,true);
    //}

    #endregion

    private void  ConfigureLog(string sFileName)
    {


    }
}
 22
Author: dekdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-13 03:35:02

Tenga en cuenta que cuando el proceso se ejecuta como Servicio de Windows, Entorno.CurrentDirectory será "C:\Windows\system32"

Así que si pones el archivo de configuración de log4net (log4net.config) junto a su *.exe, puede usar el siguiente código para configurar log4net.

var assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
XmlConfigurator.Configure(new FileInfo(Path.Combine(assemblyFolder, "log4net.config")));
 13
Author: YantingChen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-10 01:27:38

Después de comprobar y volver a comprobar... :-)

Todo lo que necesita es llamar a XmlConfigurator.Configure(); antes de crear el registrador (solo una vez).

Encantado de ayudarte,

Ofir

 9
Author: Ofir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-09 12:29:33

Aquí está la configuración que funciona para mí.

AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]

Log4net.Config

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
            <param name="File" value="C:\TEMP\Logs.txt"/>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock,log4net" />
            <appendToFile value="true" />
            <rollingStyle value="Size" />
            <maxSizeRollBackups value="2" />
            <maximumFileSize value="1MB" />
            <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>
        </layout>
    </appender>
    <root>
         <level value="ALL" />
         <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Código C #

private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(typeof(class_name));

Tengo esta configuración en el proyecto Biblioteca de clases C# y todos los demás proyectos usan esta referencia de proyecto para registrar las excepciones.

 9
Author: Deeptechtons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-11 09:38:52

Si va a crear un archivo de configuración diferente y poner cosas relacionadas con log4net en él, entonces tendrá que utilizar [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"...\log4net.config", Watch = true)] dentro de AssemblyInfo.cs en lugar de solo

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

De lo contrario, tienes que poner <log4net> ... </log4net> parte de la configuración dentro de su aplicación .config

 4
Author: Alpay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-09 16:54:20

Lo siento si algunos de estos parecen obvios, pero estos son los que verificaría:

  • Asegúrese de tener su log4net.config propiedades del archivo Copiar a la salida establecer para Copiar siempre, verificar comprobando el archivo en su directorio bin

  • También nota de los documentos de log4net relacionados con AssemblyInfo.propiedades cs:

El uso de atributos puede ser un método más claro para definir desde dónde se cargará la configuración de la aplicación. Sin embargo es pena observando que los atributos son puramente pasivos. Son solo información. Por lo tanto, si utiliza atributos de configuración, debe invocar log4net para permitirle leer los atributos. Una simple llamada a LogManager.getLogger causará los atributos en el ensamblado que llama para ser leído y procesado. por lo Tanto, es imperativo hacer un registro de llamadas tan pronto como sea posible durante la puesta en marcha de la aplicación, y ciertamente, antes de que se hayan cargado los ensamblajes externos y invocado .

  • Para solucionar problemas, puede intentar cambiar de la propiedad de nivel de ensamblado a una llamada de configuración explícita

    XmlConfigurator.Configure ();

    Debería ser suficiente.

  • Siempre hago log4net.config un archivo de configuración completo, empezando por

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" 
           type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>
      <log4net>
    ...
      </log4net>
    </configuration>
    

No debería necesitar nada en la aplicación.configuración relacionada con log4net siempre y cuando su archivo de configuración sea log4net.config

 3
Author: SteveM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-09 19:09:32

Cuando dice que 'Todos los usuarios' tienen permisos completos para el directorio de registro, ¿esto incluye las cuentas de servicio?

Compruebe que LocalService, NetworkService, LocalSystem, etc. tienen permisos (dependiendo del contexto en el que se esté ejecutando el servicio).

Además, suponiendo que tenga un arnés para ejecutar el servicio como una aplicación, ¿funciona el registro cuando se ejecuta como su usuario?

Si no se ejecuta bien como una aplicación, tiene un problema con la configuración de log4net (que otro respuestas han tratado de abordar).

 3
Author: l33tmike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-14 15:52:35

Log4net se ejecuta bajo los privilegios del usuario activo. Asegúrese de que el usuario activo tiene derechos para crear/modificar/eliminar el archivo de texto especificado.

 1
Author: user2373845,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-12 15:26:11

¿Podría cargar su aplicación para que yo pudiera depurarla?

Algunos que recomiendo comprobar:

  1. Reemplazar todos los " \ " en la ruta del archivo a "\"

  2. Coloque toda la configuración de log4net incrustada en el archivo de configuración de la aplicación.

  3. Habilitar la depuración de log4net (ver aquí)

  4. Prueba una configuración diferente. simplemente obtenga una configuración de muestra para algún lugar en Internet.

  5. Sólo para estar seguro, daría permisos máximos para todos los usuarios en su directorio de registro

  6. Intente desinstalar el servicio y reinstalarlo.

 1
Author: Uri Abramson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-15 06:09:57

Si tiene un archivo separado para log4net.config. ¿Ha establecido la siguiente propiedad:

Copiar al directorio de salida = Copiar siempre

 0
Author: shawtza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-19 18:38:40

He visto que su código tiene un problema menor en AssemblyInfo.cs.

Reemplace su código por : [asamblea: log4net.Config.XmlConfigurator(ConfigFile = " {{folder_path}} \ log4net.config")]

Donde {{folder_path}} es la ruta de acceso de su log4net.config

 0
Author: Essie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-02 04:18:19