这个问题在我的脑海中唠叨了一段时间......为了使日志变得有用,它应该是代码中的每一个,但它会使代码难以阅读。如下代码:
public IDictionary<decimal, Status> GetStatus(decimal[] keys)
{
_logger.Debug("ENTERED GetStatus");
IDictionary<decimal, Status> statuses = new Dictionary<decimal, Status>();
string inClause = null;
inClause = FormatInClause(keys, inClause);
_logger.DebugFormat(" inClause: '{0}' ", inClause);
if (string.IsNullOrEmpty(inClause))
{
_logger.Error("Key collection is null or empty.");
throw new Exception("Key collection is null or empty.");
}
if (!IsOpen)
Connection.Open();
using (IDbCommand cmd = Connection.CreateCommand())
{
cmd.CommandText = " select id, date, status " +
" from ORDERS where id in ( " + inClause + " ) ";
inClause = null;
using (IDataReader reader = cmd.ExecuteReader())
{
int i = 0;
while (reader.Read())
{
object[] values = new object[reader.FieldCount];
reader.GetValues(values);
DebugHelper.LogValues(_logger, " reader.Read() #" + i + " reader.GetValues(values): ", values);
statuses[(decimal)values[0]] = new Status(
(decimal)values[0],
ValueOrDefult<string>(values[1]),
ValueOrDefult<string>(values[2]),
(decimal)values[3],
ValueOrDefult<DateTime>(values[4]));
_logger.DebugFormat(" reader.Read() #{0} created new Status() ", i);
values = null;
i++;
}
}
}
_logger.Debug("EXITED GetStatus");
return statuses;
}
是否有一些记录策略不会降低源代码的可读性?
答案 0 :(得分:8)
Aspect oriented programming应该像cross-cutting concerns一样帮助记录,例如。 postsharp但除非你采用更传统的方法,否则你无法对记录的内容进行非常精细的控制
答案 1 :(得分:3)
imho你的日志记录混乱,因为你的代码也是如此。您应该阅读SOLID原则。
例如,将阅读器代码移动到单独的方法。
答案 2 :(得分:1)
您可以遵循一些规则。
1)只记录您实际“处理”它们的错误。
2)使用AOP来包装你的方法,这样你就不必在所有方法的进入和退出时都有debuging语句。您还可以让AOP调用记录方法的进入和退出参数/响应。
答案 3 :(得分:0)
查看一个方面编织器,例如PostSharp
答案 4 :(得分:-2)
你的源代码看起来很好......实际上它看起来最好,因为我可以看到日志消息并找出每两条消息之间的内容。
尽管有一件事困扰着我,但 _logger 确实是 _ 。
某些日志记录apis倾向于提出缩短的API,如:
l.d("debug")
l.c("critical")
...etc
上面的方式或你的方式都很好imho。
修改强>
如果您仍想对此做些什么,只需将日志记录行包装到#regions并折叠它们。