log instalar ejemplo c# .net logging log4net

c# - instalar - ¿Puede configurar log4net en código en lugar de usar un archivo de configuración?



log4net implementation in c# (5)

Alternativamente, puede crear un atributo personalizado que herede de log4net.Config.ConfiguratorAttribute y codificar su configuración allí:

using log4net.Appender; using log4net.Config; using log4net.Core; using log4net.Layout; using log4net.Repository; using log4net.Repository.Hierarchy; using System; using System.Reflection; namespace ConsoleApplication1 { [AttributeUsage(AttributeTargets.Assembly)] public class MyConfiguratorAttribute : ConfiguratorAttribute { public MyConfiguratorAttribute() : base(0) { } public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository) { var hierarchy = (Hierarchy)targetRepository; var patternLayout = new PatternLayout(); patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; patternLayout.ActivateOptions(); var roller = new RollingFileAppender(); roller.AppendToFile = false; roller.File = @"Logs/EventLog.txt"; roller.Layout = patternLayout; roller.MaxSizeRollBackups = 5; roller.MaximumFileSize = "1GB"; roller.RollingStyle = RollingFileAppender.RollingMode.Size; roller.StaticLogFileName = true; roller.ActivateOptions(); hierarchy.Root.AddAppender(roller); hierarchy.Root.Level = Level.Info; hierarchy.Configured = true; } } }

A continuación, agregue lo siguiente a un archivo .cs:

[assembly: ConsoleApplication1.MyConfigurator]

Entiendo por qué log4net utiliza los archivos app.config para configurar el registro, por lo que puede cambiar fácilmente la forma en que se registra la información sin necesidad de volver a compilar el código. Pero en mi caso no quiero empacar un archivo app.config con mi ejecutable. Y no tengo deseos de modificar mi configuración de registro.

¿Hay alguna manera de configurar el inicio de sesión en el código en lugar de utilizar app.config ?

Aquí está mi archivo de configuración simple:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/EventLog.txt" /> <appendToFile value="false" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="5" /> <maximumFileSize value="1GB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <appender name="MemoryAppender" type="log4net.Appender.MemoryAppender"> </appender> <root> <level value="Info" /> <appender-ref ref="RollingLogFileAppender" /> <appender-ref ref="MemoryAppender" /> </root> </log4net> </configuration>

EDITAR:

Para ser completamente claro: mi objetivo es no tener ningún archivo XML. Ni siquiera como un recurso integrado que convierto en una transmisión. Mi objetivo era definir el registrador completamente programáticamente. Solo curiosidad si es posible y si es así, dónde podría encontrar un ejemplo de la sintaxis.


La respuesta aceptada funciona después de encontrar dos advertencias:

  • Al principio no funcionaba para mí, pero después de usar una ruta completa de absolutos para el roller.File Propiedad del roller.File , comenzó a funcionar.
  • Tuve que usar esto en F # (en un script fsx), así que tuve algunos problemas al convertirlo de C #. Si está interesado en el resultado final (incluida una forma de descargar el paquete log4net nuget), consulte a continuación:

nuget_log4net.fsx:

#!/usr/bin/env fsharpi open System open System.IO open System.Net #r "System.IO.Compression.FileSystem" open System.IO.Compression type DummyTypeForLog4Net () = do () module NetTools = let DownloadNuget (packageId: string, packageVersion: string) = use webClient = new WebClient() let fileName = sprintf "%s.%s.nupkg" packageId packageVersion let pathToUncompressTo = Path.Combine("packages", packageId) if (Directory.Exists(pathToUncompressTo)) then Directory.Delete(pathToUncompressTo, true) Directory.CreateDirectory(pathToUncompressTo) |> ignore let fileToDownload = Path.Combine(pathToUncompressTo, fileName) let nugetDownloadUri = Uri (sprintf "https://www.nuget.org/api/v2/package/%s/%s" packageId packageVersion) webClient.DownloadFile (nugetDownloadUri, fileToDownload) ZipFile.ExtractToDirectory(fileToDownload, pathToUncompressTo) let packageId = "log4net" let packageVersion = "2.0.5" NetTools.DownloadNuget(packageId, packageVersion) let currentDirectory = Directory.GetCurrentDirectory() // https://.com/a/19538654/6503091 #r "packages/log4net/lib/net45-full/log4net" open log4net open log4net.Repository.Hierarchy open log4net.Core open log4net.Appender open log4net.Layout open log4net.Config let patternLayout = PatternLayout() patternLayout.ConversionPattern <- "%date [%thread] %-5level %logger - %message%newline"; patternLayout.ActivateOptions() let roller = RollingFileAppender() roller.AppendToFile <- true roller.File <- Path.Combine(currentDirectory, "someLog.txt") roller.Layout <- patternLayout roller.MaxSizeRollBackups <- 5 roller.MaximumFileSize <- "1GB" roller.RollingStyle <- RollingFileAppender.RollingMode.Size roller.StaticLogFileName <- true roller.ActivateOptions () let hierarchy = box (LogManager.GetRepository()) :?> Hierarchy hierarchy.Root.AddAppender (roller) hierarchy.Root.Level <- Level.Info hierarchy.Configured <- true BasicConfigurator.Configure(hierarchy) let aType = typedefof<DummyTypeForLog4Net> let logger = LogManager.GetLogger(aType) logger.Error(new Exception("exception test"))



También puede escapar de XML por completo, escribí una muestra con una configuración programática mínima here .

En pocas palabras, esto es lo que necesitas

var tracer = new TraceAppender(); var hierarchy = (Hierarchy)LogManager.GetRepository(); hierarchy.Root.AddAppender(tracer); var patternLayout = new PatternLayout {ConversionPattern = "%m%n"}; tracer.Layout = patternLayout; hierarchy.Configured = true;


SOLUCIÓN FINAL: 1

Para cualquiera que se tropiece con esto en el futuro, esto es lo que hice. Hice la clase estática a continuación:

using log4net; using log4net.Repository.Hierarchy; using log4net.Core; using log4net.Appender; using log4net.Layout; namespace Spectrum.Logging { public class Logger { public static void Setup() { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); PatternLayout patternLayout = new PatternLayout(); patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; patternLayout.ActivateOptions(); RollingFileAppender roller = new RollingFileAppender(); roller.AppendToFile = false; roller.File = @"Logs/EventLog.txt"; roller.Layout = patternLayout; roller.MaxSizeRollBackups = 5; roller.MaximumFileSize = "1GB"; roller.RollingStyle = RollingFileAppender.RollingMode.Size; roller.StaticLogFileName = true; roller.ActivateOptions(); hierarchy.Root.AddAppender(roller); MemoryAppender memory = new MemoryAppender(); memory.ActivateOptions(); hierarchy.Root.AddAppender(memory); hierarchy.Root.Level = Level.Info; hierarchy.Configured = true; } } }

Y entonces todo lo que tuve que hacer fue reemplazar el código donde llamé al archivo XML con la siguiente llamada:

//XmlConfigurator.Configure(new FileInfo("app.config")); // Not needed anymore Logger.Setup();

1 (esta respuesta fue editada en la pregunta por el OP, me tomé la libertad de convertirla en una respuesta de la comunidad, mire aquí por qué )