Logger是我在各类编程语言中使用最多,同时也是改进最多的一个函数,今天在iOS下又折腾了一番,终于找到我想要的一个版本,这里做一个总结。

python版

python对logger有专门的支持,只需要把log格式设置为自己想要的即可:

  1. import logging
  2.  
  3. ......
  4. loggingFormat = '%(asctime)s %(lineno)4d %(levelname)-8s %(message)s'
  5. logging.basicConfig(level=logging.DEBUG, format=loggingFormat, datefmt='%H:%M')
  6.  
  7. logging.debug('hello word!')

输出:

00:08     1 DEBUG    hello world!

C++版

C++版本中我借鉴了ATL的做法:

  1. #pragma once
  2. // author : palanceli.blog.163.com
  3.  
  4. #include <windows.h>
  5. #include <atlstr.h>
  6.  
  7. #include <stdio.h>
  8. #define WIDEN2(x) L ## x
  9. #define WIDEN(x) WIDEN2(x)
  10. #define __WFILE__ WIDEN(__FILE__)
  11. #ifdef _UNICODE
  12. #define __TFILE__ __WFILE__
  13. #else
  14. #define __TFILE__ __FILE__
  15. #endif
  16.  
  17. #ifdef _DEBUG
  18. #define Logging CLogger(__TFILE__, __LINE__).Log
  19. #else
  20. #define Logging __noop
  21. #endif
  22.  
  23. class CLogger
  24. {
  25. public:
  26.  
  27. CLogger(const TCHAR *pszFileName, int nLineNo)
  28. : m_pszFileName(pszFileName), m_nLineNo(nLineNo)
  29. {
  30. const TCHAR* p = _tcsrchr(m_pszFileName, '\\');
  31. if(p != NULL)
  32. m_pszFileName = p + ;
  33. }
  34. void __cdecl Log(const WCHAR* pszFmt, ...) const;
  35.  
  36. private:
  37. void __cdecl FormatLog(va_list& ptr, LPCTSTR pszFmt, LPCTSTR szType, ATL::CString& strMsg) const;
  38.  
  39. void __cdecl DoLog(ATL::CString& strMsg) const;
  40.  
  41. CLogger &__cdecl operator=(const CLogger &right);
  42.  
  43. const TCHAR* m_pszFileName;
  44. const int m_nLineNo;
  45. };
  46.  
  47. void __cdecl CLogger::Log(const WCHAR *pszFmt, ...) const
  48. {
  49. va_list ptr; va_start(ptr, pszFmt);
  50. ATL::CString strMsg;
  51. FormatLog(ptr, pszFmt, _T("LOG"), strMsg);
  52. va_end(ptr);
  53.  
  54. DoLog(strMsg);
  55. }
  56.  
  57. void __cdecl CLogger::FormatLog(va_list& ptr, LPCTSTR pszFmt, LPCTSTR szType, ATL::CString& strMsg) const
  58. {
  59. ATL::CString strFileNameAndLine, strTemp2;
  60. strTemp2.FormatV(pszFmt, ptr);
  61. strFileNameAndLine.Format(_T("%s:%d"), m_pszFileName, m_nLineNo);
  62. strMsg.Format(_T("%-16s %3s %s\n"), strFileNameAndLine, szType, strTemp2);
  63. }
  64.  
  65. void __cdecl CLogger::DoLog(ATL::CString& strMsg) const
  66. {
  67. OutputDebugStringW(strMsg);
  68. }

使用的时候,只需要

Logging(_T("Hello %s!"), _T("word"));

objective-c版本

经历一番折腾之后,找到最精简的方式,只需要在预编译头文件中添加这么一个宏定义,即可更改NSLog的输出格式:

  1. #if DEBUG
  2. #define NSLog(FORMAT, ...) fprintf(stderr,"[%s:%d]\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String])
  3. #else
  4. #define NSLog(FORMAT, ...) nil
  5. #endif

代码

NSLog(@"Hello %@!", @"word");

输出为:

[main.m:15] Hello word!

需要补充说明一点,xcode添加预编译头文件的步骤:

1、需要添加文件,类型选择Other - PCH File

2、在PROJECT和TARGET的Build Settings - Apple LLVM 7.0 - Language - Precompile Prefix Header 选择Yes;Prefix Header 添加$(SRCROOT)/<pch文件名>

由于之前不知道宏定义中的##__VA_ARGS__的写法,使用这种方式,前面的C++版本也不用搞那么复杂了。

关于Logger的更多相关文章

  1. ABP源码分析八:Logger集成

    ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...

  2. org.apache.log4j.Logger详解

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...

  3. Java程序日志:java.util.logging.Logger类

    一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...

  4. [LeetCode] Logger Rate Limiter 记录速率限制器

    Design a logger system that receive stream of messages along with its timestamps, each message shoul ...

  5. .Net Core Logger 实现log写入本地文件系统

    .net core 自带一个基础的logger框架Microsoft.Extensions.Logging. 微软默认实现了Microsoft.Extensions.Logging.Console.d ...

  6. Android源码——Logger日志系统

    Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的. 日志保存在内核空间中 缓冲区保存日志   分类方法:日志的类型  +   日志的输出量   日志类型:   main ...

  7. java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;

    如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...

  8. LeetCode 359 Logger Rate Limiter

    Problem: Design a logger system that receive stream of messages along with its timestamps, each mess ...

  9. 你的日志组件记录够清晰嘛?--自己开发日志组件 Logger

    现在现成的日志组件实在是太多太多,为什么我还需要自己实现呢????? 需求来源于java的log4j, [07-31 16:40:00:557:WARN : com.game.engine.threa ...

  10. log4j2 不使用配置文件,动态生成logger对象

    大家平时使用Log4j一般都是在classpath下放置一个log4j的配置文件,比如log4j.xml,里面配置好Appenders和Loggers,但是前一阵想做某需求的时候,想要的效果是每一个任 ...

随机推荐

  1. 反射ORM 三层(for oracle)

    sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 3·oracle使用了存储过程以获得当前插入数据的ID DAL层的ORM using Oracle.Dat ...

  2. java基础知识(15)----StringBuffer与StringBuilder

    StringBuffer字符串缓冲区: 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符.特点:1:可以对字符串内容进行修改.2:是一个容器.3:是可变长度的.4:缓冲区中可以存储任意类型 ...

  3. nginx upstream的几种配置方式

    nginx 的upstream目前支持4种方式的分配 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器 ,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weigh ...

  4. Json-lib 进行java与json字符串转换之二

    二.list和json字符串的互转 list-->>json字符串 public static void listToJSON(){ Student stu=new Student(); ...

  5. Excel向数据库插入数据和数据库向Excel导出数据

    为了熟悉java里工作簿的相关知识点,所以找了“Excel向数据库插入数据和数据库向Excel导出数据”的功能来实现. 注意事项:1,mysql数据库: 2,需要导入的jar包有 jxl.jar,my ...

  6. struts-hibernate整合(1)配置环境

    ①加载jar包 创建类库: 在myeclipse中点击windows---Preference---Java---Build Path---User Libraries---new 输入创建类库名字s ...

  7. Android上 dip、dp、px、sp等单位说明

    dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. ...

  8. 免安装Oracle客户端使用PL/SQL连接Oracle

    只需要在Oracle下载一个叫Instant Client Package的软件就可以了,这个软件不需要安装,只要解压就可以用了,很方便,就算重装了系统还是可以用的. 下载地址:http://www. ...

  9. spirng boot web配置开发

    spring-booter-starter-web是spring-boot web发开的核心,自动配置信息存储在spring-boot-autoconfigure.jar 下面的web目录里面,包含了 ...

  10. css背景图片位置:background的position(转)

    css背景图片位置:background的position   position的两个参数:水平方向的位置,垂直方向的位置----------该位置是指背景图片相对于前景对象的 1.backgroun ...