我对在我的 C# 项目中使用 NLog 很感兴趣,并且发现它很棒,但是
在我的国家/地区,客户使用“波斯日历”。
如您所知,微软开发了一个名为“C# Persian Calendar class”的库来支持。
我需要在两个地方使用波斯日历日期格式
1-消息时间戳
基于 2 日期的文件名
如何强制 NLog 在上述用法中使用“C# 波斯日历类”?
谢谢
最佳答案
您不必修改 NLog 源代码并自行构建它。您也许可以编写自己的 PersianDateLayoutRenderer。然后,将 NLog 配置为使用您的布局渲染器而不是 NLog 的内置布局渲染器是一件简单的事情。当您升级到新版本 NLog 时,您的布局渲染器应该仍然可以工作。
这是一个结合了 NLog 的 LongDateLayoutRenderer 和 .NET Persian Calendar 的示例。我不知道格式是否适用于波斯日期,所以我只是硬编码了一种格式。
您可以使用 ${persianlongdate} 而不是 ${shortdate}、${longdate} 或 ${date} 在 NLog.config 文件中进行配置。
我还没有尝试构建或运行它,但它应该非常接近。如果您决定尝试该路线,则可以轻松修改它以使用 Jon 的 Noda Time。
您可以在这里找到 NLog 的 LongDateLayoutRenderer(以及 DateLayoutRenderer 和 ShortDateLayoutRenderer)的源代码:
https://github.com/NLog/NLog/blob/master/src/NLog/LayoutRenderers
namespace MyLayoutRenderers
{
using System.ComponentModel;
using System.Globalization;
using System.Text;
using NLog.Config;
[LayoutRenderer("persianlongdate")]
[ThreadAgnostic]
public class PersianSLongDateLayoutRenderer : LayoutRenderer
{
PersianCalendar pc = new PersianCalendar();
/// <summary>
/// Gets or sets a value indicating whether to output UTC time instead of local time.
/// </summary>
/// <docgen category='Rendering Options' order='10' />
[DefaultValue(false)]
public bool UniversalTime { get; set; }
/// <summary>
/// Renders the current short date string (yyyy-MM-dd) and appends it to the specified <see cref="StringBuilder" />.
/// </summary>
/// <param name="builder">The <see cref="StringBuilder"/> to append the rendered data to.</param>
/// <param name="logEvent">Logging event.</param>
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
DateTime ts = logEvent.TimeStamp;
//Not sure if UniversalTime makes sense for PersianCalendar. Do you?
if (this.UniversalTime)
{
ts = ts.ToUniversalTime();
}
builder.Append(String.Format("{0}-{1}-{2}-{3}:{4}-{5}-{6}",
pc.GetDayOfWeek(ts),
pc.GetMonth(ts),
pc.GetDayOfMonth(ts),
pc.GetYear(ts),
pc.GetHour(ts),
pc.GetMinute(ts),
pc.GetSecond(ts));
}
}
}
祝你好运!
关于c# - NLog 使用波斯历日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773971/