我在网站上看到过这样的例子,但是所有的地方持有人都被指错,或者参数和持有人数量不同,我的日志如下所示
Logger.InfoFormat("Successfully connected to outgoing queue for platform {0}. QueueManagerName = {1}, HostName = {2}, ChannelName = {3}, QueueName = {4}", Platform.ID, Platform.MqGatewayParams.QueueManagerName, Platform.MqGatewayParams.HostName, Platform.MqGatewayParams.ChannelName, Platform.MqGatewayParams.OutgoingQueueName);
InfoFormat方法:
public void InfoFormat(string className, string methodName, string format, object arg0, object arg1, object arg2)
{
_log4NetLogger.InfoFormat(GetMessageString(className, methodName, format), arg0, arg1, arg2);
}
并在内部调用GeMessageString
private string GetMessageString(string className, string methodName, object message)
{
return string.Format("[{0}::{1}] {2}", className ?? string.Empty, methodName ?? " ", message ?? " ");
}
任何人都可以告诉我这里我做错了什么吗?
答案 0 :(得分:2)
使用InfoFormat
方法:
_log4NetLogger.InfoFormat(GetMessageString(className, methodName, format), arg0, arg1, arg2);
这只将3格式参数传递给_log4NetLogger.InfoFormat
,但您的格式字符串为5。
您需要将params
用于可变长度参数列表,如下所示:
void FormatString(string format, params object[] args) {
String.Format(format, args)
}
(为较短的参数列表提供重载有一个小好处 - 以String.Format
本身为例 - 因为不需要分配数组;但除非使用这些函数,否则它是一个小优化很多。)
PS。示例调用者似乎将格式字符串作为InfoFormat
的第一个参数传递,但其实现似乎期望参数查找字符串。