/// <summary>
/// A wrapper for debugging information in the Serilog loggers.
/// Usage: Log.DebugInfo().Information(message)
/// Usage: Log.DebugInfo().Debug(message) etc.
/// </summary>
/// <param name="logger">
/// The Serilog Log to use.
/// </param>
/// <param name="memberName">
/// The name of the class calling the event log.
/// </param>
/// <param name="sourceFilePath">
/// The name of the file hosting the class.
/// </param>
/// <param name="sourceLineNumber">
/// the line in the source code file.
/// </param>
/// <returns>
/// </returns>
public static ILogger DebugInfo(this ILogger logger
#if DEBUG
// DebugInfo gets inline in release mode.
,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
#else
)
#endif
{
return logger
#if DEBUG
.ForContext("MemberName", memberName)
.ForContext("FilePath", Path.GetFileName(sourceFilePath))
.ForContext("LineNumber", sourceLineNumber)
#endif
;
}
}
可以这样称呼
Logger.DebugInfo().Warning("Warining message with a parameter in message template style: {Parameter}", _parameter);
6条答案
按热度按时间ryoqjall1#
在编译时还是在运行时-在编译时,可以使用
#if DEBUG
。在运行时,可以使用[Conditional("DEBUG")]
来指示只应在调试版本中调用的方法,但这是否有用取决于要在调试版本和发布版本之间进行的更改类型。6psbrbz92#
不过,我倾向于同意伊托尔森的观点。
bnl4lu3b3#
我个人不喜欢
#if DEBUG
改变布局的方式,我通过创建一个条件方法来实现,这个方法只在调试模式下调用,并通过引用传递一个布尔值。amrnrhlw4#
我倾向于在AssemblyInfo.cs中放置如下内容:
fjaof16o5#
您可以将ILSpy用于exe和dll。只需将DLL\EXE拖到资源管理器侧栏,您就可以看到:[程序集:可调试行....
范例1:编译为出版模式:
示例2:编译为调试模式:
brc7rcf06#
即使线程是旧的,它可能是有用的,有一个程序检查。
在运行时检查是否附加了调试器。IsAttached属性是调试器类型的静态属性,因此它始终提供bool结果。
预处理器指令
#if DEBUG
是目前在编译时删除(或将其抛出)某些代码的最快方法,但在发布和调试编译之间切换时可能会发出警告,尤其是当您在块中定义变量时(至少在注解中)。例如,检查以下DebugInfo()方法的实现,该方法允许您轻松地内联到日志记录工具中:可以这样称呼
以在日志文件中获得有关调用日志行的类和代码文件的更多信息。
解决方案是将XML注解的一部分也包含到条件语句中,但这会使整个注解不可读。
在Hans的注解之后,是的,有人可能在VS之外运行调试版本,这是一种病态的可能性。那么,Matthew
IsDebugMode
提出的静态方法是最直接的方法,它将条件语句的优点包括在一个简单的方法中,而不允许其缺点在代码中蔓延。