2012-01-03 16 views
8

Estamos utilizando NLog para iniciar sesión en una aplicación web C# MVC3. Todos nuestros controladores amplían una base personalizada "ApplicationController" que nos da acceso a los métodos y methodes constantemente necesarios. .Tipo de clase derivada de C# necesaria en la base para el registro con NLog

me gustaría tener todos los controladores de acceso al registrador a través de esta clase base, pero quiero el detalle de saber qué clase derivan las declaraciones de registro se originaron en

Nuestro controlador de aplicación es el siguiente:

public abstract class ApplicationController : Controller 
{ 
    protected Logger _logger; 
    protected virtual Logger Logger 
    { 
     get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); } 
    } 

    protected ApplicationController() 
    { 
     Context = new Entities(); 
    } 

Si un controlador derivado no anula el registrador, todas las declaraciones mostrarán que se originaron desde el controlador de la aplicación. Actualmente, tengo esencialmente la misma declaración de Logger en todos los controladores derivados. Por ejemplo:

public class PropertyController : ApplicationController 
{ 
    private readonly DatatapeService _datatapeService; 
    private readonly PropertyService _propertyService; 
    protected override Logger Logger 
    { 
     get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); } 
    } 

Obviamente, esta es una práctica de implementación deficiente.

  1. ¿Cómo puedo secar esto? Específicamente, ¿cuál es mi comprensión de C# que falta para lograr exactamente esta tarea específica?
  2. ¿Existe un patrón de registro que debería seguir cuando no estoy exponiendo la clase de registro (NLog) directamente?

TIA!

Respuesta

12

No estoy familiarizado con NLog, pero en Log4Net la sintaxis LogManager.GetLogger(this.GetType()) logrará lo que desea. GetType devuelve el tipo de hoja en su jerarquía de herencia, aunque haya sido convocada en la clase base ApplicationController, cuando se crea por primera vez el registrador (es decir: en el primer acceso a la propiedad Logger) se creará una instancia con el tipo PropertyController

+0

Creo 'this.GetType(). Name' debe hacerlo. –

+1

Esto es exactamente lo que fui. No me di cuenta de esto. GetType devolvería la clase más derivada. Esto me permitió crear una sola propiedad en mi ApplicationController y luego usar ese registrador en toda la aplicación. –

+0

Me alegro de ser de ayuda y gracias por la marca: D –

0

Sólo echa Nlog wiki here

En la mayoría de los casos usted tendrá un registrador por clase, así que tiene sentido dar registrador el mismo nombre que la clase actual.

tiene sentido hacerlo así

public abstract class ApplicationController : Controller 
{ 
    protected Logger _logger; 
    protected virtual Logger Logger(string className) 
    { 
     return LogManager.GetLogger(className); 
    } 
} 


public class PropertyController : ApplicationController 
{ 
    private readonly DatatapeService _datatapeService; 
    private readonly PropertyService _propertyService; 
    protected override Logger Logger() 
    { 
     return base.Logger("PropertyController "); 
    } 
} 
+6

Realmente no me gusta ese enfoque. Si hago eso, estoy copiando y pegando el código en cada controlador. Se siente mal tener tanta duplicación. –

+0

@BobbyB snippet, clase base común?NLog usa un patrón flyweight para las configuraciones del registrador, por lo que la sobrecarga es mínima. Las líneas que debido al registro real son en gran parte duplicadas. – Gusdor

3

API Nlog es ligeramente diferente a Log4net. Es necesario utilizar

Logger = LogManager.GetLogger(GetType().Name); 

Si pasa únicamente el tipo, LogManager esperará un tipo registrador (es decir, un registrador de costumbre)

+1

Encuentro LogManager.GetLogger (GetType(). FullName) para ser más útil –

+0

Gracias @DavidHayes - de acuerdo con usted. Entonces, el equivalente a 'GetCurrentClassLogger()' para una propiedad de clase base usaría: 'get {return _logger ?? (_logger = LogManager.GetLogger (this.GetType(). FullName)); } ' – Beel

Cuestiones relacionadas