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,);
if err!=nil {
fmt.Printf("%s\r\n",err.Error());
os.Exit(-);
}
defer logfile.Close();
logger := log.New(logfile,"\r\n",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, )
if err != nil {
fmt.Printf("%s\r\n", err.Error())
os.Exit(-)
}
defer logfile.Close()
writers := []io.Writer{
logfile,
os.Stdout,
}
fileAndStdoutWriter := io.MultiWriter(writers...)
logger := log.New(fileAndStdoutWriter, "\r\n", 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\n", 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()
//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\n", url, err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
//gLogger.Debug("body=%s\n", body) gCurCookies = resp.Cookies() respHtml = string(body) return respHtml
} func printCurCookies() {
var cookieNum int = len(gCurCookies);
gLogger.Info("cookieNum=%d", cookieNum)
for i := ; i < cookieNum; i++ {
var curCk *http.Cookie = gCurCookies[i];
//gLogger.Info("curCk.Raw=%s", curCk.Raw)
gLogger.Info("------ Cookie [%d]------", i)
gLogger.Info("Name\t=%s", curCk.Name)
gLogger.Info("Value\t=%s", curCk.Value)
gLogger.Info("Path\t=%s", curCk.Path)
gLogger.Info("Domain\t=%s", curCk.Domain)
gLogger.Info("Expires\t=%s", curCk.Expires)
gLogger.Info("RawExpires=%s", curCk.RawExpires)
gLogger.Info("MaxAge\t=%d", curCk.MaxAge)
gLogger.Info("Secure\t=%t", curCk.Secure)
gLogger.Info("HttpOnly=%t", curCk.HttpOnly)
gLogger.Info("Raw\t=%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/
golang log的更多相关文章
- golang log 使用
原文:https://www.jianshu.com/p/d634316a9487 --------------------------------------------- 在我们开发程序后,如果有 ...
- 支持rotate和大小限制的golang log库
支持大小限制和rotate的log库,还是很有必要的,前者让你不再操心磁盘被吃光,后者让查日志更方便. 但是在golang中没有太好的实现,看过一些开源的和自行实现的,都有几个不满意的地方,比如: 没 ...
- golang log日志
写入日志文件 func main() { file, err := os.Create("test.log") if err != nil { log.Fatalln(" ...
- golang——log包学习
log包实现了简单的日志服务. 1.func New(out io.Writer, prefix string, flag int) *Logger New创建一个Logger. 参数out设置日志信 ...
- golang之log rotate
操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 golang的log模块提供的有写日志功能,示例代码如下: /* golang log example E-Mail : ...
- Golang 标准库提供的Log(一)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1405754 G ...
- Golang 异常/日志处理
1.xerrors 异常 xerrors 包是一个非常棒的设计,不同于往常语言如java/php,因为go的errors只是一个string类型的映射,所以内存占用空间很少.这在golang的核心库和 ...
- golang日志框架--logrus学习笔记
golang日志框架--logrus学习笔记 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数,对于更精细的日志级别.日志文件分割以及日志分发等方面并没有提供 ...
- Awesome Go
A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...
随机推荐
- 漫谈C++:良好的编程习惯与编程要点(转载)
这个博主写的文章真是细腻,全面,严谨,应当多读几回 原文http://www.cnblogs.com/QG-whz/p/5517643.html 阅读目录 以良好的方式编写C++ class Clas ...
- 解决svn中“工作副本已经锁定”,或者svn清理失败的解决方法
刚开始遇到这个问题还以为是没有插网线的原因,客户端和服务器都在我的电脑上,但是更新和提交都执行不了,以为是没有插网线就没把这个小问题放在心上,今早上还是这样,就不得不解决一下了. 更新或者提交前要执行 ...
- Android(java)学习笔记22:我们到底该如何处理异常?
1. 我们到底该如何处理异常? (1)原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个 ...
- luogu P1121 环状最大两段子段和
嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...
- 过拟合是什么?如何解决过拟合?l1、l2怎么解决过拟合
1. 过拟合是什么? https://www.zhihu.com/question/264909622 那个英文回答就是说h1.h2属于同一个集合,实际情况是h2比h1错误率低,你用h1来训练, ...
- 【洛谷P4342】[IOI1998]Polygon
Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...
- Android学习笔记_5_文件操作
1.Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. package com.example.servi ...
- 【题解】UVA756 Biorhythms (中国剩余定理)
UVA756:https://www.luogu.org/problemnew/show/UVA756 思路 几乎是裸的中国剩余定理模板题 但是需要注意的是此题并不是求最小正整数解 而是求大于d的解 ...
- html基础用法(上)
html的定义: html超文本标记语言,标准通用标记语言下的一个应用. “超文本”就是指页面内可以包含图片,链接,甚至音乐,程序等非文字语言. 超文本标记语言的结构包括“头”部分(head),和“主 ...
- c# 分布式系统开发
开篇吹牛,吹大牛了各位. 接连几篇博文,已经将了我们系统常用的东西,主要针对服务端,非桌面系统. 聊了这么久了,最后将这所有内容打包,完成一个系统.可能称为组件才合适,因为我没有提供启动程序. 每一个 ...