程序中打日志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序中打日志相关的知识,希望对你有一定的参考价值。

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

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

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


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

 

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

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

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


 

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

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

  

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

以上是关于程序中打日志的主要内容,如果未能解决你的问题,请参考以下文章

Log4j2:异步日志中打印方法名和行号信息

如何使错误日志更加方便地排查问题

为啥即使我的数据库已连接,我的 Heroku 应用程序在其他设备中打开时也没有加载任何数据?

如何打日志才能方便排查问题?

看了这篇文章,比同事更快找到bug!

所谓的动态IP和静态IP的区别是什么?