C# 条件日志记录/跟踪

2023-11-25

我想向我的 C# 应用程序添加日志记录或跟踪,但如果日志详细级别设置得太低以致于不会记录消息,我不希望记录格式化字符串或计算值的开销。

在 C++ 中,您可以使用预处理器定义宏来阻止代码被执行,如下所示:

#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }

像这样使用:

VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());

在 C# 中如何做到这一点?

我已阅读解释跟踪和调试功能的 Microsoft 文档here,并且他们声称使用 #undef DEBUG 和 #undef TRACE 会从生成的可执行文件中删除所有跟踪和调试代码,但它真的会删除整个调用吗?意思是,如果我写

System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());

如果我取消定义 TRACE,它不会调用我昂贵的函数?或者确实拨打了电话,then决定它不会追踪任何东西?

不管怎样,即使它确实删除了它,这也比 C++ 宏要差,因为我不能让那个丑陋的大调用看起来像我在 C++ 中的简单 VLOG() 调用,并且仍然避免评估参数,可以吗?我也无法像在 C++ 中那样通过在运行时定义较低的详细程度来避免开销,对吧?


要回答您的问题之一,如果 Trace.WriteLine 被编译出来,则必须评估才能调用 Trace.WriteLine (或其兄弟/表兄弟)的所有方法调用都不会被调用。因此,请继续将昂贵的方法调用直接作为 Trace 调用的参数放入,如果您没有定义 TRACE 符号,它将在编译时删除。

现在,关于有关在运行时更改详细程度的其他问题。这里的技巧是 Trace.WriteLine 和类似的方法采用“params object[] args”作为其字符串格式化参数。仅当实际发出字符串时(当详细程度设置得足够高时),该方法才会在这些对象上调用 ToString 以从中获取字符串。因此,我经常玩的一个技巧是将对象而不是完全组装的字符串传递给这些方法,并将字符串创建保留在我传入的对象的 ToString 中。这样,仅在实际发生日志记录时才支付运行时性能税,它使您可以自由地更改详细程度,而无需重新编译您的应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 条件日志记录/跟踪 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • Opencv中SVM参数优化

    我想优化Opencv中的SVM参数 但是 每次我使用train auto I get C 1 and gamma 1 有些人使用 LibSVM 但我无法为此编写包装器 两个都trainingData and labels取自现有代码 该代码
  • 混合行为 - 你可以绑定到它们的属性吗?

    我目前正在将我创建的许多附加行为迁移到混合行为 以便它们支持在 Expression Blend 中进行拖放 我注意到混合行为的作者倾向于将行为属性定义为依赖属性 我创造了一种行为 TiltBehaviour 它公开了公共依赖属性 Tilt
  • unsigned long 的类型与 Windows 上的 uint32_t 和 uint64_t 不同(VS2010)

    在 Windows 7 32 位下的 Visual Studio 2010 上 unsigned long 似乎是与 uint32 t 和 uint64 t 不同的类型 参见如下测试程序 include
  • 如何在 Meteor 中使用用户 JSON 文件?

    我需要知道 Meteor JS 中 JSON 文件的用法 首先 JSON 文件存储在 Meteor 文件夹结构中 以及如何使用 Meteor JS 获取 JSON 数据 它是使用扩展名 JSON 保存的 JSON 文件吗 我对此一无所知 您
  • Phonegap 2.4.0 与 Android 4.2 - 奇怪的双击行为

    我正在使用phonegap 2 4 0 创建Android 和iOS 应用程序 现在我认识到 在 Nexus 4 设备上使用 Android 4 2 2 的 Android 应用程序中 链接中的 onclick 事件会被触发两次 就像双击一
  • Vuetify 表单 .$refs validate 不是函数

    我在 v on 处理程序中收到错误 TypeError 当我单击控制台中的发送时 this refs EmailMessage validate 不是我表单上的函数 并且 this refs EmailMessage validate 不是
  • XML 架构:具有仅包含文本的属性的元素?

    我很难找到这个 如何在 XML 的 XML 架构文件中定义如下所示的元素
  • 使用 Net::HTTP.get 作为 https url

    我正在尝试使用Net HTTP get 对于 https URL data Net HTTP get uri Net HTTP https default port 但是 当我尝试打印结果时 得到以下结果 无法将 URI HTTPS 转换为
  • Oracle - 从引用游标中选择特定列

    我的情况 我有一个名为 Table1 的表 它有很多列 其中之一是 Column1 我不知道其他栏目 它们有时甚至可能会改变 有一个强类型引用游标类型 它返回 Table1 rowtype 名为 cur Table1 我有一个名为 SP1
  • Symfony2.8。如何从post请求中获取数据

    如何在控制器中接收来自 POST 请求的数据 我不用树枝 public function newAction Request request when I use content request gt getContent as resul
  • 如何在 C# 中格式化日期?

    在将 DateTime 对象格式化为字符串表示形式时 C 提供了很大的灵活性 但是 必须了解所有格式字符串才能使用这种灵活性 如果你想以 Fri June 24 的形式显示日期 你可以这样做 DateTime someDate DateTi
  • Amazon Cloudsearch:过滤是否存在

    我有一个亚马逊云搜索域 目的是过滤 语言 字段是否存在 并非所有对象都有语言 我希望过滤那些确实有语言的对象 但也返回那些没有任何语言的对象 我想过滤 or language en language null 但是 不能在字符串中传递 nu
  • 为什么不是 C# 的 memberinfo() 反射函数 [重复]

    这个问题在这里已经有答案了 有sizeof and typeof 但为什么不memberinfo 返回一个实例System Reflection MemberInfo为帮助反射代码而选择的部分代码 Example Program Type
  • 无法向 LinearLayout 添加多个片段

    我正在使用具有垂直方向的 LinearLayout 来列出片段 我以编程方式将片段添加到容器中 如下所示 FragmentTransaction ft fragmentManager beginTransaction Fragment fr
  • Java中查找连续字符的字符串

    用 Java 编写一个函数 它接受一个字符串数组 并从字符串数组中仅返回那些连续重复特定字母的字符串 例如 如果 I P 是 Dauresselam slab fuss boolean clap 那么 O P 应该是 Dauresselam
  • 如何修复 jquery 库中的“jQuery 未定义”错误?

    导轨修复 确保在任何脚本加载之前 以便首先加载 jquery 这看起来真的很奇怪 当我加载页面时 出现 2 个 js 错误 在 Chrome 中 jquery ui min js 17 Uncaught ReferenceError jQu
  • MATLAB 图形绘制:在绘图过程中分配图例标签

    我正在以典型的 MATLAB 散点图格式绘制数据 通常 在绘制多个数据集时 我会使用命令 hold on 然后绘制每个数据 然后绘制图例 legend DataSet1 DataSet2 etcetera 但是 我在同一轴上绘制的 多个 数
  • CSS 固定跨度宽度

    在无序列表中 li span span The lazy dog li li span AND span The lazy cat li li span OR span The active goldfish li 允许添加类或样式属性 但
  • 为什么 Thread 的子类可以吞咽 InterruptedException?

    在布莱恩 戈茨的书中关于如何处理 InterruptedException 的文章 有一段话很突出 接受中断的一次是当您知道线程即将退出时 仅当调用可中断方法的类是 Thread 而不是 Runnable 的一部分时 才会出现这种情况 我不
  • C# 条件日志记录/跟踪

    我想向我的 C 应用程序添加日志记录或跟踪 但如果日志详细级别设置得太低以致于不会记录消息 我不希望记录格式化字符串或计算值的开销 在 C 中 您可以使用预处理器定义宏来阻止代码被执行 如下所示 define VLOG level expr