2012-02-03 18 views
5

Estoy tratando de usar el 'Database' NLog target y me gustaría que NLog lea mi cadena de conexión para evitar tener que configurarla dos veces en el mismo archivo de configuración. El problema es que tengo un Entity Framework-style connection string, por lo que no funciona el uso del atributo connectionStringName.NLog con una cadena de conexión de Entity Framework?

En log4net, puedo usar un custom AdoNetAppender y extraer las piezas apropiadas de la cadena de conexión. ¿Hay alguna forma de personalizar el destino de la base de datos de NLog para que pueda pasar una cadena de conexión con el estilo adecuado?

Respuesta

7

Este problema puede ser resuelto fácilmente por objetivo configurar el registro de código:

private DatabaseTarget CreateDatabaseTarget() 
    { 
     var entityFrameworkConnection = ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString; 
     var builder = new EntityConnectionStringBuilder(entityFrameworkConnection); 
     var connectionString = builder.ProviderConnectionString; 

     var target = new DatabaseTarget() 
     { 
      ConnectionString = connectionString, 
      CommandText = @"insert into Log ([DateTime], [Message]) values (@dateTime, @message);", 
      Parameters = { 
       new DatabaseParameterInfo("@dateTime", new NLog.Layouts.SimpleLayout("${date}")), 
       new DatabaseParameterInfo("@message", new NLog.Layouts.SimpleLayout("${message}")), 
      } 
     }; 
     return target; 
    } 

entonces se puede inscribir con su configuración Nlog:

var target = CreateDatabaseTarget(); 
LogManager.Configuration.AddTarget("databaseTarget", CreateDatabaseTarget()); 
LogManager.Configuration.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Warn, target)); 

Pero si estás bien con tomando algunas dependencias de Nuget o quiere una solución más completa, puede echar un vistazo a los repositorios y NLog.EntityFramework que tienen paquetes nuget disponibles ...

+2

Debe tenerse en cuenta que el OP es el creador del paquete NLog.EntityFramework al que se ha vinculado. –

+1

Sí, creado como resultado de esta pregunta que no tiene una respuesta satisfactoria en ese momento. :-) – ladenedge

5

No hay forma de personalizar el built in DatabaseTarget porque es sealed. Y no hay otros puntos de extensión debido a que el DatabaseTarget.InitializeTarget() siempre habrá una excepción porque no se puede crear el formulario DbProviderFactory la EF providerName="System.Data.EntityClient"

Así que con la versión actual Nlog 2.0.0.0 tienes que opciones siguientes:

  1. Puede duplicar la cadena de conexión o puede usar los atributos de configuración de base de datos DatabaseTarget.
  2. Puede escribir su propio custom target básicamente desde cero.
  3. Puede enviar una solicitud de función y esperar hasta que se implemente.
+0

Dang, temía que esas fueran mis únicas opciones. – ladenedge

0

Una manera de conseguir una cadena de conexión normal a partir de un DbContext es la siguiente:

context.Database.Connection.ConnectionString 

Asumiendo que tiene la cadena de conexión en el formato adecuado, creo que es más fácil de configurar el destino de esta manera:

1) definir el objetivo en su configuración

<target name="database" type="Database" connectionString="${gdc:myConnectionString}"> 
    <commandText> 
     ... 
    </commandText> 

2) establecer la cadena de conexión en tiempo de ejecución

GlobalDiagnosticsContext.Set("myConnectionString", connectionString); 

De esta manera, no codifica el comportamiento de destino de db.

Cuestiones relacionadas