简体   繁体   English

如何使用 F# 中的 ZeroLog?

[英]How to use ZeroLog from F#?

I could not find any details on this.我找不到这方面的任何细节。

Here is the code:这是代码:

// external
open ZeroLog
open ZeroLog.Appenders
open ZeroLog.Config
open System.Collections.Generic
// internal

module Logging =  

  let logManager =
    let appender = new ConsoleAppender()
    let defaultAppenderConfig = DefaultAppenderConfig()
    defaultAppenderConfig.PrefixPattern <- "[%level] @ %time - %logger :: "
    appender.Configure(defaultAppenderConfig)
    let appenders =  new List<IAppender>(capacity=1)
    appenders.Add(appender)
    BasicConfigurator.Configure(appenders)  

  let getLogger (name:string) =
    LogManager.GetLogger(name)

  let testLogging () =
    let logger = getLogger "Main"
    logger.Info("test")

It compiles but when I try to use testLogging it does not print anything.它可以编译,但是当我尝试使用 testLogging 时,它不会打印任何内容。 Maybe I need to configure some additional details but I am not sure what.也许我需要配置一些额外的细节,但我不确定是什么。

Static initializer for Logging.fs file is not being called ( 12.5.1 Execution of Static Initializers ) because it's not an entry point file and you are not accessing any value which has observable initialization (yes, that's a vague definition).未调用Logging.fs文件的 Static 初始化程序( 12.5.1 执行 Static 初始化程序),因为它不是入口点文件,并且您没有访问任何具有可观察初始化的值(是的,这是一个模糊的定义)。 The point is - if static initializer wasn't called, then logManager value wasn't initialized.关键是 - 如果未调用 static 初始化程序,则未初始化logManager值。 Which means in your case that all logger configuration code wasn't executed.这意味着在您的情况下,所有记录器配置代码都没有执行。

The simplest way to make sure logger is initialized is to move initialization logic to function and call it explicitely:确保记录器已初始化的最简单方法是将初始化逻辑移动到 function 并显式调用它:

let init () =
    let appender = new ConsoleAppender()
    let defaultAppenderConfig = DefaultAppenderConfig()
    defaultAppenderConfig.PrefixPattern <- "[%level] @ %time - %logger :: "
    appender.Configure(defaultAppenderConfig)
    let appenders = new List<IAppender>(capacity=1)
    appenders.Add(appender)
    BasicConfigurator.Configure(appenders) |> ignore

Make sure you call it at the top of Main before you use logging确保在使用日志记录之前在Main顶部调用它

Logging.init()
Logging.testLogging()

Note that even direct access to logManager value will trigger static initializer only in Debug mode (because of unused values optimizations in Release mode):请注意,即使直接访问logManager值也只会在调试模式下触发 static 初始化程序(因为在发布模式下未使用值优化):

let _ = Logging.logManager // works in Debug only
Logging.testLogging()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM