• golang log


    自带log模块

       写入文件

       

    package main
    
    import (
        "fmt"
        "log"
        "os"
    )
    
    func main(){
        logfile,err := os.OpenFile("d:/test.log",os.O_APPEND|os.O_RDWR|os.O_CREATE,0);
        if err!=nil {
            fmt.Printf("%s
    ",err.Error());
            os.Exit(-1);
        }
        defer logfile.Close();
        logger := log.New(logfile,"
    ",log.Ldate|log.Ltime|log.Llongfile);
        logger.Println("hello");
        logger.Println("oh....");
        logger.Fatal("test");
        logger.Fatal("test2");
    }

     写入文件同时输入到控制台

    package main
    
    import (
        "fmt"
        "io"
        "log"
        "os"
    )
    
    func main() {
        logfile, err := os.OpenFile("d:/test.log", os.O_APPEND|os.O_RDWR|os.O_CREATE, 0777)
        if err != nil {
            fmt.Printf("%s
    ", err.Error())
            os.Exit(-1)
        }
        defer logfile.Close()
        writers := []io.Writer{
            logfile,
            os.Stdout,
        }
        fileAndStdoutWriter := io.MultiWriter(writers...)
        logger := log.New(fileAndStdoutWriter, "
    ", log.Ldate|log.Ltime|log.Llongfile)
        logger.Println("hello")
        logger.Println("oh....")
        logger.Fatal("test")
        logger.Fatal("test2")
    }

    补充:

    Ldate、Ltime等被定义为常量:
    const (
        // Bits or'ed together to control what's printed. There is no control over the
        // order they appear (the order listed here) or the format they present (as
        // described in the comments).  A colon appears after these items:
        //	2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
        Ldate         = 1 << iota     // the date: 2009/01/23
        Ltime                         // the time: 01:23:23
        Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
        Llongfile                     // full file name and line number: /a/b/c/d.go:23
        Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
        LstdFlags     = Ldate | Ltime // initial values for the standard logger
    )

    log4go模块

    /*
     * [File]
     * EmulateLoginBaidu.go
     *
     * [Function]
     * 【记录】用go语言实现模拟登陆百度
     * http://www.crifan.com/emulate_login_baidu_using_go_language/
     *
     * [Version]
     * 2013-09-19
     *
     * [Contact]
     * http://www.crifan.com/about/me/
     */
    package main
     
    import (
        //"fmt"
        //"builtin"
        //"log"
        "os"
        "runtime"
        "path"
        "strings"
        //"io"
        "time"
        "io/ioutil"
        "net/http"
        //"net/http/cookiejar"
        //"sync"
        //"net/url"
    )
     
    //import l4g "log4go.googlecode.com/hg"
    //import l4g "code.google.com/p/log4go"
    import "code.google.com/p/log4go"
     
    /***************************************************************************************************
        Global Variables
    ***************************************************************************************************/
    var gCurCookies []*http.Cookie;
    //var gLogger *log.Logger;
    var gLogger log4go.Logger;
     
    /***************************************************************************************************
        Functions
    ***************************************************************************************************/
    //do init before all others
    func initAll(){
        gCurCookies = nil
        gLogger = nil
         
        initLogger()
        initCrifanLib()
    }
     
    //de-init for all
    func deinitAll(){
        gCurCookies = nil
        if(nil == gLogger) {
            gLogger.Close();
            gLogger = nil
        }
    }
     
    //do some init for crifanLib
    func initCrifanLib(){
        gLogger.Debug("init for crifanLib")
        gCurCookies = nil
        return
    }
     
    //init for logger
    func initLogger(){
        var filenameOnly string
        filenameOnly = GetCurFilename()
        var logFilename string =  filenameOnly + ".log";
         
        //gLogger = log4go.NewLogger()
        gLogger = make(log4go.Logger)
        //for console
        //gLogger.AddFilter("stdout", log4go.INFO, log4go.NewConsoleLogWriter())
        gLogger.AddFilter("stdout", log4go.INFO, log4go.NewConsoleLogWriter())
        //for log file
        if _, err := os.Stat(logFilename); err == nil {
            //fmt.Printf("found old log file %s, now remove it
    ", logFilename)
            os.Remove(logFilename)
        }
        //gLogger.AddFilter("logfile", log4go.FINEST, log4go.NewFileLogWriter(logFilename, true))
        gLogger.AddFilter("logfile", log4go.FINEST, log4go.NewFileLogWriter(logFilename, false))
        gLogger.Info("Current time is : %s", time.Now().Format("15:04:05 MST 2006/01/02"))
     
        return
    }
     
    // GetCurFilename
    // Get current file name, without suffix
    func GetCurFilename() string {
        _, fulleFilename, _, _ := runtime.Caller(0)
        //fmt.Println(fulleFilename)
        var filenameWithSuffix string
        filenameWithSuffix = path.Base(fulleFilename)
        //fmt.Println("filenameWithSuffix=", filenameWithSuffix)
        var fileSuffix string
        fileSuffix = path.Ext(filenameWithSuffix)
        //fmt.Println("fileSuffix=", fileSuffix)
         
        var filenameOnly string
        filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix)
        //fmt.Println("filenameOnly=", filenameOnly)
         
        return filenameOnly
    }
     
    //get url response html
    func GetUrlRespHtml(url string) string{
        gLogger.Debug("GetUrlRespHtml, url=%s", url)
        var respHtml string = "";
         
        resp, err := http.Get(url)
        if err != nil {
            gLogger.Warn("http get url=%s response errror=%s
    ", url, err)
        }
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        //gLogger.Debug("body=%s
    ", body)
     
        gCurCookies = resp.Cookies()
         
        respHtml = string(body)
     
        return respHtml
    }
     
    func printCurCookies() {
        var cookieNum int = len(gCurCookies);
        gLogger.Info("cookieNum=%d", cookieNum)
        for i := 0; i < cookieNum; i++ {
            var curCk *http.Cookie = gCurCookies[i];
            //gLogger.Info("curCk.Raw=%s", curCk.Raw)
            gLogger.Info("------ Cookie [%d]------", i)
            gLogger.Info("Name	=%s", curCk.Name)
            gLogger.Info("Value	=%s", curCk.Value)
            gLogger.Info("Path	=%s", curCk.Path)
            gLogger.Info("Domain	=%s", curCk.Domain)
            gLogger.Info("Expires	=%s", curCk.Expires)
            gLogger.Info("RawExpires=%s", curCk.RawExpires)
            gLogger.Info("MaxAge	=%d", curCk.MaxAge)
            gLogger.Info("Secure	=%t", curCk.Secure)
            gLogger.Info("HttpOnly=%t", curCk.HttpOnly)
            gLogger.Info("Raw	=%s", curCk.Raw)
            gLogger.Info("Unparsed=%s", curCk.Unparsed)
        }
    }
     
    func main() {
        initAll()
     
        gLogger.Info("this is EmulateLoginBaidu.go")
     
        var baiduMainUrl string
        baiduMainUrl = "http://www.baidu.com/";
        //baiduMainUrl := "http://www.baidu.com/";
        //var baiduMainUrl string = "http://www.baidu.com/";
        gLogger.Info("baiduMainUrl=%s", baiduMainUrl)
        respHtml := GetUrlRespHtml(baiduMainUrl)
        gLogger.Debug("respHtml=%s", respHtml)
        printCurCookies()
         
        deinitAll()
    }

    转自:http://www.crifan.com/go_language_output_log_to_both_file_and_console_meantime_via_log4go/

  • 相关阅读:
    JDBC编程步奏、问题总结(一)
    基于注解的Spring AOP的配置和使用--转载
    什么是aop?-------转
    The JSP specification requires that an attribute name is preceded by whitespace--异常
    使用注解来构造IoC容器-转
    Java单元测试(Junit+Mock+代码覆盖率)---------转
    Linux 杂项
    Sequence
    vim编辑器高亮sv语法
    linux 权限 chmod 755
  • 原文地址:https://www.cnblogs.com/wangxusummer/p/4064653.html
Copyright © 2020-2023  润新知