gpt4 book ai didi

c# - 在 Python 中获取 C# 日志

转载 作者:行者123 更新时间:2023-11-28 18:15:45 25 4
gpt4 key购买 nike

我已经使用 pythonnet 构建了一个使用 C# 代码(构建并存储为 dll)的 python 库。在该库中,我使用 python 记录器生成日志。

mylibrary.py

logger = logging.getLogger('mylibrary')
logger.info('logging from my library')

根记录器由用户代码配置。例如,根记录器的处理程序由用户使用记录器的“addhandler()”方法设置,指定格式、输出文件等。在我的库中,我只是记录 (logger.info()...) 而没有配置任何东西用户设置的根处理程序负责将其写入文件。

用户代码.py

root_logger = getLogger()
root_logger.addHandler(FileHandler('abc.log'))
root_handler.setFormat(...)

用户可以通过设置我的图书馆使用的记录器级别来控制我的图书馆可以记录的内容。 usercode.py 中的以下行将我的库记录器的日志记录级别设置为临界,这样库就不能记录低于它的任何内容(logger.info() 不会进入 abc.log)。

getLogger('mylibrary').setLevel(CRITICAL)

现在问题来了。由于我在我的库中使用 C# 代码,

  1. 我想将 C# 日志捕获到 abc.log 中
  2. 我也想像配置 python 日志一样配置 C# 日志

所以这条线

getLogger('mylibrary').setLevel(CRITICAL) 

在 usercode.py 中现在应该确保只有 python 和 C# 中的关键日志进入 abc.log

有什么办法可以实现吗?

最佳答案

不可以,您不能同时从 Python 和 C# 登录到同一个文件。这样做的原因是 Python 的日志记录(也可能是 C# 日志记录)没有配备并发日志记录——即使日志文件没有被其中之一“锁定”,也有可能将不同的日志混合在一起,因为多个作者。

如果您不拥有 C# dll,您可能就不走运了 - 除非它允许您从 C# 程序配置日志文件/级别,否则 Python 无法修复它。但是,如果您控制源代码并且可以构建新的 dll,请考虑更改 C# 类以允许您传入委托(delegate)/lambda(假设这是在 PythonNet 中实现的),这将简单地回调到 Python 的记录器函数。

例子:

C#代码:

public class CoolImportedFeature
{
private readonly Action<string> LogCallback;

public CoolImportedFeature(string inputA, int inputB, Action<string, string> logCallback)
{
LogCallback = logCallback;
// do other constructor stuff
}

public void SomeMethod()
{
// do something
LogCallback("critical", "An error occurred");
}
}

python 代码:

def log_callback(log_level, message):
getattr(logger, log_level)(message)
import CoolImportedFeature
feat = CoolImportedFeature("hello", 1, log_callback)
feat.SomeMethod()

类似的东西 - Python 的日志级别和 C# 之间没有神奇的转换,所以你需要在那里做一些转换(或者我上面使用的 getattr 反射)。

关于c# - 在 Python 中获取 C# 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48515473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com