Sharepoint 计时器作业和 log4net

Posted

技术标签:

【中文标题】Sharepoint 计时器作业和 log4net【英文标题】:Sharepoint Timer Job and log4net 【发布时间】:2009-10-28 13:47:51 【问题描述】:

我正在开发一个自定义 SharePoint 解决方案,它包含一个功能和一个计时器作业(由 FeatureActivated 中的功能创建)。 在我的解决方案中,我想使用 log4net 进行日志记录(我知道 ULS)。

特性本身中的 log4net 一切都很好(只是将 log4net.config 放在 web.config 附近,一切都很好),但我完全不知道如何从计时器作业初始化 log4net(考虑到它不是由IIS,但由 OSWTIMER)。

谁能帮我找到问题的答案:

    在哪里存储 log4net.config 以及如何将其传递给作业? 是否需要在每次调用 Execute() 方法时初始化 log4net?

谢谢!

【问题讨论】:

【参考方案1】:

自从我使用 log4net 已经有一段时间了,但如果我没记错的话,您可以将配置文件存储在您想要的任何位置,并让 log4net 在记录器初始化期间从那里加载它。

1) 存储配置文件的好地方是 12 个配置单元内的文件夹。也许是您的功能的文件夹。由于此文件的路径不会更改,因此应该很容易使用记录器引用它。

2) 我认为您每次都必须初始化记录器,因为SPJobDefinition(计时器作业类)在不运行时存储在数据库中。将计时器作业存储在数据库中的功能来自 SPJobDefinition 的基类SPPersistedObject。从 SPPersistedObject 继承的类的成员变量,应与该类一起存储在数据库中,必须用[Persisted] 属性标记。但据我所知,持久化对象只能是基本数据类型(int、long、string,...)。

因此,在数据库中存储 log4net Logger 对象将不起作用或至少不受支持。因此,每次从数据库加载作业时,都必须再次初始化 Logger 对象。

【讨论】:

谢谢,弗洛!很有帮助。但是您如何将 log4net.config 的路径(假设它在 12 个配置单元以下)传递给工作?我对 sharepoint 很陌生,但据我所知,这项工作可能在另一台机器上运行 是的,您是对的,您无法定义作业将在哪个服务器上运行,但它肯定会在前端服务器上运行。通过 SharePoint 解决方案(.wsp 文件)将您的配置文件作为一项功能应用,它将被预配到场的每个字体终端服务器。因此,无论在哪个服务器上运行,该作业都可以访问该文件。

以上是关于Sharepoint 计时器作业和 log4net的主要内容,如果未能解决你的问题,请参考以下文章

更新 AD 组内的 sharepoint 用户配置文件

如何清除SharePoint Server 配置缓存

转:SharePoint2013TimerJob计时器发送邮件

如何从 Sharepoint 2010 沙盒中的单独线程访问 SPSite 对象

SharePoint PowerShell 修改计时器任务

可以将 log4net 配置为以自己的身份运行吗?