如何在C程序中将日志逻辑与业务逻辑分开?在C++中?

dev*_*ium 7 c c++ logging aspects

我目前正在用C编码,我有很多printfs,所以我可以在某些时候跟踪我的应用程序的流程.问题是有时我想要比其他人更多的细节,所以我通常花时间评论/取消注释我的C代码,所以我可以获得适当的输出.

使用Java或C#时,我通常可以使用Aspects将我的实现代码与日志记录逻辑分开.

您是否在C中使用了类似的技术来解决这个问题?

我知道我可以放置一个名为DEBUG的标志,可以打开或关闭,所以每次我想要显示或隐藏printfs时,我都不必四处寻找并注释/取消注释我的整个代码.问题是我还想摆脱代码中的日志记录逻辑.

如果用C++编写代码而不是CI,它会更好吗?

编辑

似乎有一个AspectC++,所以对于C++似乎有一个解决方案.C怎么样?

谢谢

sbi*_*sbi 10

IME您无法真正将日志记录与要记录的算法分开.策略性地放置日志记录需要时间和经验.通常,代码会在整个生命周期内保持汇编日志语句(尽管它是渐近的).通常,日志记录随代码而发展.如果算法经常更改,通常会记录日志代码.

您可以做的是尽可能使记录变得不引人注目.也就是说,确保日志记录语句始终是单行,不会破坏读取算法,使其他人可以将其他日志记录语句插入到现有算法中,而无需完全了解您的日志记录库等.

简而言之,就像处理字符串处理一样处理日志记录:将它包装在一个很好的小lib中,它将被包含在任何地方并使用,快速创建lib,并使其易于使用.


Ste*_*sop 5

并不是的.

如果你有可变的宏,你可以轻松地玩这样的游戏:

#ifdef NDEBUG
    #define log(...) (void)0
#else
    #define log(...) do {printf("%s:%d: ", __FILE__, __LINE__); printf(__VA_ARGS__);} while(0)
#endif
Run Code Online (Sandbox Code Playgroud)

您还可以以更精细的粒度关闭和打开日志记录:

#define LOG_FLAGS <something>;

#define maybe_log(FLAG, ...) do { if (FLAG&LOG_FLAGS) printf(__VA_ARGS__);} while(0)

int some_function(int x, int y) {
    maybe_log(FUNCTION_ENTRY, "x=%d;y=%d\n", x, y);
    ... do something ...
    maybe_log(FUNCTION_EXIT, "result=%d\n", result);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

显然,这可能有点单调乏味,只允许从每个函数返回一次,因为你无法直接获得函数返回.

任何这些宏和调用printf都可以替换为允许实际日志格式和目标与业务逻辑分离的东西(其他宏或可变函数调用),但某些日志记录的事实不能完成真的.

aspectc.org声称提供了一个C和C++编译器,其语言扩展支持AOP.我不知道它处于什么状态,如果你使用它,那么你当然不再真正编写C(或C++)了.

请记住,C++具有多重继承,这有时对横切关注有帮助.有足够的模板,您可以做出非凡的事情,甚至可能实现自己的方法调度系统,允许某种连接点,但这是一件很重要的事情.