2011-01-06 20 views
11

Quiero implementar la función de registro en una biblioteca de clases, que a su vez se hace referencia en un servicio web. Traté de agregar app.config e hice todo lo necesario, pero parece que cuando se lanza una excepción, log4net simplemente no hace nada.¿Cómo incluir log4net para una biblioteca de clases?

mi app.config

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="test" /> 
     </filter> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="error" /> 
     </filter> 
     <filter type="log4net.Filter.DenyAllFilter" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="RollingFileAppender"/> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 
    </log4net> 

en AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config")] 

en LogManager.cs:

private static readonly ILog Log = log4net.LogManager.GetLogger 
      (MethodBase.GetCurrentMethod().DeclaringType); 
public static void WriteLog(Exception ex) 
{ 
    Log.Error(ex); 
} 

¿Puede usted por favor dime lo que está mal? ¿Cómo puedo hacer que log4net funcione para mi biblioteca de clase?

Gracias

+0

¿Cómo se ve el código en el lugar al que llama el WriteLog? –

+0

Por cierto, ha intentado establecer su nivel en root en ALL e intente eliminar todos esos filtros en su RollingFileAppender. –

+0

@Pauli: Intenté como sugirió, todavía no funcionó :) – Vimvq1987

Respuesta

1

Por favor, vea mi respuesta a la siguiente pregunta: ¿

Use log4net in SDK

Tiene una rutina de configuración del registro que va a construir una ruta completa a un archivo de configuración de log4net. Como estás en un servicio web, no miro donde esperas para "app.config".

También asegúrese de tener permiso para escribir en "D: \ mylogfile.txt" desde su servicio web.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/17881155) –

6

En tiempo de ejecución, el archivo de configuración siempre se utiliza desde la aplicación de host, a menos que se declare explícitamente. Aquí en el caso, web.config se está utilizando, no app.cofig. Más bien mencione algún otro nombre de archivo de configuración personalizada y asegúrese de que el archivo se copie en el directorio virtual del servicio web. También como dijo chibacity, asegúrese de tener permiso en el archivo de registro. Es mejor mantenerlo en la carpeta app_data para el host del servicio web.

3

usted podría utilizar algún tipo de inyección, ya sea que construir un sencillo como:

public interface ILogger 
{ 
    void LogInfo(string message); 
     . 
     . 
     . 
} 

Y entonces acaba de inyectar algo que coincide con la interfaz, como un contenedor para log4net o algo así.

Pero, creo que lo más correcto es no iniciar sesión en la biblioteca de la clase. Por qué creo que sí es porque la biblioteca en sí no es la aplicación, su servicio web es para que su servicio web decida qué registrar. Si desea registrar excepciones, simplemente no las capture en la biblioteca de la clase y deje que su servicio web maneje el registro. Esto también facilitará la centralización del registro.

+0

@Thomas Acepto. utilizando una abstracción, pero hay muchas buenas razones por las que puede querer que una biblioteca inicie sesión, p.diagnóstico y auditoría. Si algo está mal con la biblioteca, tener diagnósticos que puedan activarse es algo bueno. –

+0

@chibacity: Mi nombre es Tomás no Thomas;). Excepto por eso estoy de acuerdo con usted en esos aspectos, pero creo que debe mantenerse al mínimo. Si algo está mal en la biblioteca, la excepción debería indicarlo, y eso podría registrarse más arriba en la pila. En un mundo ideal, una biblioteca debe ser un tercero (pero también puede ser la tercera parte) que debe "hacerse". ¿O estás hablando de algún otro tipo de "errores"? ¿Errores que no arrojan excepciones? –

+0

Disculpe la ortografía del nombre :) Me refiero a información que puede ayudar a analizar problemas que pueden no conducir a excepciones. Incluso en los casos en que hay excepciones, a menudo es útil tener información de diagnóstico circundante para ver las condiciones que conducen a un error. Esto puede ser de particular importancia en la producción donde el software puede estar siendo utilizado de maneras crueles e inusuales;) –

Cuestiones relacionadas