程序中打日志

断点调试和打印日志各有优点,下面我们来简要说说如何在程序中打印日志,在BCB6.0中实现。

[cpp] view plain copy

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <wtypes.h>
  5. #include <stdio.h>
  6. #include <fstream>
  7. #include <string>
  8. using namespace std;
  9. #include "Unit1.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. //---------------------------------------------------------------------------
  15. __fastcall TForm1::TForm1(TComponent* Owner)
  16. : TForm(Owner)
  17. {
  18. }
  19. //---------------------------------------------------------------------------
  20. void __fastcall TForm1::Button1Click(TObject *Sender)
  21. {
  22. SYSTEMTIME stCurTime = {0};
  23. GetLocalTime(&stCurTime);
  24. char szTime[128] = {0};
  25. sprintf(szTime, "%d-%d-%d %d:%d:%d", stCurTime.wYear, stCurTime.wMonth, stCurTime.wDay, stCurTime.wHour, stCurTime.wMinute, stCurTime.wSecond);
  26. char szLocation[1024] = {0};
  27. sprintf(szLocation, "Function--->%s, Line: %d, File: %s", __FUNC__, __LINE__, __FILE__);
  28. char buf[2048] = {0};
  29. sprintf(buf, "%s %s", szTime, szLocation);
  30. ofstream outfile("log.txt", ios::app);
  31. outfile << buf << endl;
  32. }
  33. //---------------------------------------------------------------------------

结果,log.txt中为:

2013-11-9 10:42:57 Function--->TForm1::Button1Click, Line: 32, File: C:\Documents and Settings\Administrator\hL?\bcbTest\Unit1.cpp
2013-11-9 10:42:59 Function--->TForm1::Button1Click, Line: 32, File: C:\Documents and Settings\Administrator\hL?\bcbTest\Unit1.cpp
2013-11-9 10:43:0 Function--->TForm1::Button1Click, Line: 32, File: C:\Documents and Settings\Administrator\hL?\bcbTest\Unit1.cpp

实际上,上述只是打印了基本的信息,后续博文中会介绍如何打印其它需要打印的信息。

前面博文中的打印日志方法太复杂,能不能简单一点呢?我能!

[cpp] view plain copy

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <wtypes.h>
  5. #include <stdio.h>
  6. #include <fstream>
  7. #include <string>
  8. using namespace std;
  9. #include "Unit1.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. void logFunc(char *function, int line, char *file, char *msg)
  15. {
  16. SYSTEMTIME stCurTime = {0};
  17. GetLocalTime(&stCurTime);
  18. char szTime[128] = {0};
  19. sprintf(szTime, "%d-%d-%d %d:%d:%d", stCurTime.wYear, stCurTime.wMonth, stCurTime.wDay, stCurTime.wHour, stCurTime.wMinute, stCurTime.wSecond);
  20. char szLocation[2048] = {0};
  21. sprintf(szLocation, "%s ===> Function--->%s, Line: %d, File: %s", msg, function, line, file);
  22. char buf[2500] = {0};
  23. sprintf(buf, "%s %s", szTime, szLocation);
  24. ofstream outfile("log.txt", ios::app);
  25. outfile << buf << endl;
  26. }
  27. //---------------------------------------------------------------------------
  28. __fastcall TForm1::TForm1(TComponent* Owner)
  29. : TForm(Owner)
  30. {
  31. }
  32. //---------------------------------------------------------------------------
  33. void __fastcall TForm1::Button1Click(TObject *Sender)
  34. {
  35. logFunc(__FUNC__, __LINE__, __FILE__, "HELLO");
  36. }
  37. //---------------------------------------------------------------------------
  38. void __fastcall TForm1::Button2Click(TObject *Sender)
  39. {
  40. logFunc(__FUNC__, __LINE__, __FILE__, "WORLD");
  41. }
  42. //---------------------------------------------------------------------------

上述程序逻辑和结果正确,但有个问题,两个函数中都需要写__FUNC__, __FILE__, __LINE__这些东西,你想啊,在整个工程中有多少函数啊,所以,要改:

[cpp] view plain copy

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <wtypes.h>
  5. #include <stdio.h>
  6. #include <fstream>
  7. #include <string>
  8. using namespace std;
  9. #include "Unit1.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. void logFunc(char *msg)
  15. {
  16. SYSTEMTIME stCurTime = {0};
  17. GetLocalTime(&stCurTime);
  18. char szTime[128] = {0};
  19. sprintf(szTime, "%d-%d-%d %d:%d:%d", stCurTime.wYear, stCurTime.wMonth, stCurTime.wDay, stCurTime.wHour, stCurTime.wMinute, stCurTime.wSecond);
  20. char szLocation[2048] = {0};
  21. sprintf(szLocation, "%s ===> Function--->%s, Line: %d, File: %s", msg, __FUNC__, __LINE__, __FILE__);
  22. char buf[2500] = {0};
  23. sprintf(buf, "%s %s", szTime, szLocation);
  24. ofstream outfile("log.txt", ios::app);
  25. outfile << buf << endl;
  26. }
  27. //---------------------------------------------------------------------------
  28. __fastcall TForm1::TForm1(TComponent* Owner)
  29. : TForm(Owner)
  30. {
  31. }
  32. //---------------------------------------------------------------------------
  33. void __fastcall TForm1::Button1Click(TObject *Sender)
  34. {
  35. logFunc("HELLO");
  36. }
  37. //---------------------------------------------------------------------------
  38. void __fastcall TForm1::Button2Click(TObject *Sender)
  39. {
  40. logFunc("WORLD");
  41. }
  42. //---------------------------------------------------------------------------

上述程序逻辑上有问题,打印的不是所想要的信息,而是:

2013-11-9 11:9:44 HELLO ===> Function--->logFunc, Line: 26, File: C:\Documents and Settings\Administrator\hL?\bcbTest\Unit1.cpp
2013-11-9 11:9:44 WORLD ===> Function--->logFunc, Line: 26, File: C:\Documents and Settings\Administrator\hL?\bcbTest\Unit1.cpp

那怎么办呢?人类的智慧是无穷的,你要知道。考虑利用宏,如下:

[cpp] view plain copy

  1. //---------------------------------------------------------------------------
  2. #ifndef Unit1H
  3. #define Unit1H
  4. //---------------------------------------------------------------------------
  5. #include <Classes.hpp>
  6. #include <Controls.hpp>
  7. #include <StdCtrls.hpp>
  8. #include <Forms.hpp>
  9. #define log(msg) logFunc(__FUNC__, __LINE__, __FILE__, msg)
  10. //---------------------------------------------------------------------------
  11. class TForm1 : public TForm
  12. {
  13. __published:    // IDE-managed Components
  14. TButton *Button1;
  15. TButton *Button2;
  16. void __fastcall Button2Click(TObject *Sender);
  17. void __fastcall Button1Click(TObject *Sender);
  18. private:    // User declarations
  19. public:     // User declarations
  20. __fastcall TForm1(TComponent* Owner);
  21. };
  22. //---------------------------------------------------------------------------
  23. extern PACKAGE TForm1 *Form1;
  24. //---------------------------------------------------------------------------
  25. #endif

[cpp] view plain copy

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <wtypes.h>
  5. #include <stdio.h>
  6. #include <fstream>
  7. #include <string>
  8. using namespace std;
  9. #include "Unit1.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. void logFunc(char *function, int line, char *file, char *msg)
  15. {
  16. SYSTEMTIME stCurTime = {0};
  17. GetLocalTime(&stCurTime);
  18. char szTime[128] = {0};
  19. sprintf(szTime, "%d-%d-%d %d:%d:%d", stCurTime.wYear, stCurTime.wMonth, stCurTime.wDay, stCurTime.wHour, stCurTime.wMinute, stCurTime.wSecond);
  20. char szLocation[2048] = {0};
  21. sprintf(szLocation, "%s ===> Function--->%s, Line: %d, File: %s", msg, function, line, file);
  22. char buf[2500] = {0};
  23. sprintf(buf, "%s %s", szTime, szLocation);
  24. ofstream outfile("log.txt", ios::app);
  25. outfile << buf << endl;
  26. }
  27. //---------------------------------------------------------------------------
  28. __fastcall TForm1::TForm1(TComponent* Owner)
  29. : TForm(Owner)
  30. {
  31. }
  32. //---------------------------------------------------------------------------
  33. void __fastcall TForm1::Button1Click(TObject *Sender)
  34. {
  35. log("HELLO");
  36. }
  37. //---------------------------------------------------------------------------
  38. void __fastcall TForm1::Button2Click(TObject *Sender)
  39. {
  40. log("WORLD");
  41. }
  42. //---------------------------------------------------------------------------

这样就对了。但是,还存在一个问题,log宏不支持变参,当你用log("num is %d", num);的时候就会出错,那怎么办呢?相信一切都是有出路的,我们下次见。

  

  注:1.本文为转载文章,仅分享学习。

时间: 2024-12-28 20:55:32

程序中打日志的相关文章

java中的日志组件-log4j

1.为什么使用日志组件 Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT的事件记录器:还可以控制每一条日志输出格式.此外,通过定义日志信息的级别,能够非常细致地控制日志的输出,最令人感兴趣的是,这些功能可以通过一个配置文件来灵活进行配置,而不需要修改应程序代码. 在应用程序中输出日志有3个目的: 监视代码中变量的变化情况,把数据周期性记录到文件中供其他应用进行统计分析工作: 跟踪代码运行时轨迹,作

9 个技巧,解决 K8s 中的日志输出问题

作者 | 元乙??阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想把这些年积累的经验以文章的形式发出来,让看到文章的同学少走弯路.K8s 日志系列文章内容偏向落地实操以及经验分享,且内容会随着技术的迭代而不定期更新,本文为该系列文章的第 3 篇. 第一篇:<6 个 K8s 日志系统建设中的典型问题,你遇到过几个?> 第二篇:<一文看懂 K8s 日志系统设计

java程序中输出console的日志到文本

http://blog.sina.com.cn/s/blog_76a8411a01010u2h.html 首先:当我们引入data-integration\lib文件夹下的所有jar包后 运行java程序要求我们必须引入log4j,由此我们可以确认控制台输出的信息为log4j做的: 程序如下: public static void main(String[] args) throws Exception{ KettleEnvironment.init(); try { JobMeta jobMe

在程序中使用命令打开一个进程和记录该进程执行日志

//在需要的程序中调用ExcutedCmd函数来打开执行dos命令 //cmd 命令  args 命令参数 private static void ExcutedCmd(string cmd, string args) { using (Process p = new Process()) { ProcessStartInfo psi = new ProcessStartInfo(cmd, args); psi.CreateNoWindow = true; psi.UseShellExecute

将应用程序中的商业逻辑同对其提供支持的通用服务进行分离(转)

AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系.对于其

使用AllocConsole在Win32程序中调用控制台调试输出

近期一个Win32窗口项目中,调试时经常需要输出调试信息以追踪数据流及程序运行状态. 起初我封装了一系列文件操作,实现了日志形式的调试信息输出,但在后期的使用过程中越发觉得颇不顺手.那么,如何方便地在Win32程序中使用控制台进行调试输出?答案如题:AllocConsole函数和C-Runtime的freopen函数.具体操作流程如下: 打开控制台 重定向输出流至控制台 执行调试信息输出操作 完整代码如下: SetConsoleTitle(_T("Debug Output")); fr

游戏服务器中的日志处理方式之一

在游戏开发的过程中,我们需要记录一些日志,以便以后了解游戏运行的情况,以及根据日志发现并处理游戏中的突发情况. 一,游戏日志可以分为以下几种:1)系统日志2)用户操作日志3)异常日志,即错误日志 系统日志 系统日志一般描述的是服务器日常运行的状态.比如启动是否成功,每天统计一下内存的占用量,CPU的使用量等信息.用于查检服务器运行的健康状况.这对于技术分析来说是非常重要的.如果没有这些信息,一但服务器宕机,我们就两眼一抺黑,不知从何下手了.这部分日志一般产生的文件不大,内容不是太多,可以记录成文

网站数据统计分析中的日志收集原理及其实现

> 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析.百度统计 和 腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于javascript的.本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统. 1.数据收集原理分析 简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页.点击某按钮.将商品加入购物车等)及行为附加数据(如某下单行为产生的订单金额等).早期的网站统计往往只收

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文