关于Logger

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

python版

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

import logging

......
loggingFormat = ‘%(asctime)s %(lineno)4d %(levelname)-8s %(message)s‘
logging.basicConfig(level=logging.DEBUG, format=loggingFormat, datefmt=‘%H:%M‘)

logging.debug(‘hello word!‘)

输出:

00:08     1 DEBUG    hello world!

C++版

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

#pragma once
// author : palanceli.blog.163.com

#include <windows.h>
#include <atlstr.h>

#include <stdio.h>
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
#ifdef  _UNICODE
#define __TFILE__    __WFILE__
#else
#define    __TFILE__    __FILE__
#endif

#ifdef _DEBUG
#define Logging        CLogger(__TFILE__, __LINE__).Log
#else
#define Logging        __noop
#endif

class CLogger
{
public:    

    CLogger(const TCHAR *pszFileName, int nLineNo)
        : m_pszFileName(pszFileName), m_nLineNo(nLineNo)
    {
        const TCHAR* p = _tcsrchr(m_pszFileName, ‘\\‘);
        if(p != NULL)
            m_pszFileName = p + 1;
    }
    void __cdecl Log(const WCHAR* pszFmt, ...) const;

private:
    void __cdecl FormatLog(va_list& ptr, LPCTSTR pszFmt, LPCTSTR szType, ATL::CString& strMsg) const;

    void __cdecl DoLog(ATL::CString& strMsg) const;

    CLogger &__cdecl operator=(const CLogger &right);

    const TCHAR* m_pszFileName;
    const int m_nLineNo;
};

void __cdecl CLogger::Log(const WCHAR *pszFmt, ...) const
{
    va_list ptr; va_start(ptr, pszFmt);
    ATL::CString strMsg;
    FormatLog(ptr, pszFmt, _T("LOG"), strMsg);
    va_end(ptr);

    DoLog(strMsg);
}

void __cdecl CLogger::FormatLog(va_list& ptr, LPCTSTR pszFmt, LPCTSTR szType, ATL::CString& strMsg) const
{
    ATL::CString strFileNameAndLine, strTemp2;
    strTemp2.FormatV(pszFmt, ptr);
    strFileNameAndLine.Format(_T("%s:%d"), m_pszFileName, m_nLineNo);
    strMsg.Format(_T("%-16s %3s %s\n"), strFileNameAndLine, szType, strTemp2);
}

void __cdecl CLogger::DoLog(ATL::CString& strMsg) const
{
    OutputDebugStringW(strMsg);
}

使用的时候,只需要

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

objective-c版本

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

#if DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"[%s:%d]\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String])
#else
#define NSLog(FORMAT, ...) nil
#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++版本也不用搞那么复杂了。

时间: 2024-10-21 02:14:04

关于Logger的相关文章

Qt 实现 Logger 日志的显示

要求: 能够控制显示的总共行数.但不想要太重量级,简单显示就好. 参考StackOverflow 使用QPlainTextEdit If you want to limit the total number of paragraphs in a QPlainTextEdit, as it is for example useful in a log viewer, then you can use the maximumBlockCount property. The combination o

Android 日志记录杂谈-Logger,Timber,logback-android

转载:http://www.jianshu.com/p/39834be3cb6c "Every time you log in production, a puppy dies." – Jake Wharton 做安卓项目中,调试程序的时候一般会进行打log来查看相关信息,而我原来是使用的系统自带的Log来打印. 归结二个问题:<信息显示>,<信息存储>,就这二个问题我们具体来看如何解决 -----------------------主体分割君---------

python学习第十三节(sys,logging,logger,json)

sys模块sys模块是python和解释器之间交流的模块 sys.argv 在cmd中将可以输入内容后 自动形成为列表,可以在程序中先切片,验证登录的作用. sys.exit() 程序立刻结束,无论后面有什么程序.sys.path 显示当前搜索模块的路径优先搜索当前脚本所在目录的路径查找所需模块,没有就去python环境变量去找可以用下面这种方式在sys.path的列表中添加一个搜索的路径,叫他去另一个路径去搜索模块 log的错误日志配置文件,blog地址 http://www.cnblogs.

android logger的使用

1. 进入GitHub页面 https://github.com/orhanobut/logger 2. 在gradle里增加 compile 'com.orhanobut:logger:1.15' 3 项目中引用 import com.orhanobut.logger.Logger; 4使用log功能 Logger.d("hello"); 比原始的Log.D(TAG,"hello") 好用一点,会不会影响效率现在还没有进行测试

MyEclippse中使用struts-default.xml中定义的拦截器(timmer,logger)

环境:MyEclipse 2015 Stable 2.0:struts2-core-2.3.16.1.jar等 struts.xml <struts> <package name="p1" namespace="/" extends="struts-default"> <action name="m1" class="org.ah.s2.C1" method="m1&

linux命令之logger

logger 用于往系统中写入日志,他提供一个shell命令接口到syslog系统模块,还可以从命令行直接向系统日志文件写入一行信息,默认的日志保存在 /var/log/messages中. logger 语法 logger [options] [messages] **options (选项):**    -d, --udp          使用数据报(UDP)而不是使用默认的流连接(TCP)    -i, --id          逐行记录每一次logger的进程ID    -f, --

java.util.logging.Logger使用详解

一.创建Logger对象 static Logger getLogger(String name)           为指定子系统查找或创建一个 logger. static Logger getLogger(String name, String resourceBundleName)           为指定子系统查找或创建一个 logger. 注意:name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个. 二.Logger的级别 比log4j的级别详细,全部定

log4j:WARN No appenders could be found for logger (freemarker.cache).

为了减少控制台输出从而减少处理时间,可以设置日志级别高一点,例如设置为“ERROR” 打开类路径(就是和struts.xml文件同目录)下的log4j.properties(如果没有就新建一个),修改如下: log4j.logger.com.opensymphony.xwork2=ERROR log4j.logger.freemarker.cache=ERROR log4j.logger.freemarker.beans=ERROR log4j.logger.org.apache.struts2

Log4net源码View之Logger解析

1.简介 Logger是Log4net的三大核心载体之一,搞清楚它的意义很重大.另外两个分别是Appender和Layout.其对应关系为一个Logger对应多个Appender,一个Appender对应一个Layout. 对于Log4net的内部实现,ILogger才是接口(所有日志需要实现的——Interface that all loggers implement). 为什么不是我们所使用的ILog接口呢?实际上,ILog是对ILogger进行了包装,是典型的Wrapper模式,话说不仔细