Can you configure log4net in code instead of using a config file?

后端 未结 6 1236
日久生厌
日久生厌 2020-11-28 01:20

I understand why log4net uses app.config files for setting up logging - so you can easily change how information is logged without needing to recompile your cod

6条回答
  •  星月不相逢
    2020-11-28 01:31

    The accepted answer works after I found two caveats:

    • It was not working for me at first, but after using a full absolue path for the roller.File property, it started work.
    • I had to use this in F# (in a fsx script), so had some issues when converting it from C#. If you're interested in the end result (including a way to download log4net nuget package), see below:

    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://stackoverflow.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
    let logger = LogManager.GetLogger(aType)
    
    logger.Error(new Exception("exception test"))
    

提交回复
热议问题