我使用pythonnet构建了一个使用C#代码(使用dll构建并存储)的python库。在该库中,我使用python记录器生成日志。
mylibrary.py
logger = logging.getLogger('mylibrary')
logger.info('logging from my library')
根记录器是根据用户代码配置的。例如,根记录器的处理程序由用户使用logger" addhandler()"设置。指定格式,输出文件等的方法。在我的库中,我只是记录(logger.info()...)而没有配置任何东西,用户设置的根处理程序负责将其写入文件。
usercode.py
root_logger = getLogger()
root_logger.addHandler(FileHandler('abc.log'))
root_handler.setFormat(...)
用户可以通过设置我的库使用的记录器级别来控制我的库可以记录的内容。 usercode.py中的下面一行将我的库记录器的日志记录级别设置为critical,以便库不能记录它下面的任何内容(logger.info()不会进入abc.log )。
getLogger('mylibrary').setLevel(CRITICAL)
问题来了。因为我在我的库中使用C#代码,
所以行
getLogger('mylibrary').setLevel(CRITICAL)
usercode.py中的现在应该确保只有python和C#中的关键日志都进入abc.log
有没有办法实现这个目标?
答案 0 :(得分:1)
不,你不能同时从Python和C#登录到同一个文件。这样做的原因是Python的日志记录(也可能是C#日志记录)没有为并发日志记录配备 - 即使日志文件没有被其中一个“锁定”,也有可能将不同的日志混合在一起多位作家。
如果您不拥有C#dll,那么您可能运气不好 - 除非它允许您从C#程序配置日志文件/级别,否则Python无法修复它。但是,如果您控制源并可以构建新的dll,请考虑更改C#类以允许传入委托/ lambda(假设这是在PythonNet中实现),这将简单地回调到Python的记录器函数。
示例:
c#code:
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反射)。