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 ...
随机推荐
- Android(java)学习笔记35:如何改变Spinner系统自带的字体和颜色
1. 首先我们要知道Spinner系统自带字体和颜色本质: 原生的Spring 控件是无法更改字体和颜色的... 从下面的代码可以看出...红色的标注显示使用的是Android默认的布局.. Spin ...
- Apache轻量级性能測试工具--ab
Apache轻量级性能測试工具--ab ab早已不是什么新奇玩意,平时工作中会须要一些性能測试.简单的性能測试全然能够由AB来替代,而不须要动用LR这样重量级的工具. 此文简介一下ab的工具使用与结果 ...
- Linux 进程状态标识 Process State Definition
From : http://www.linfo.org/process_state.html 译者:李秋豪 进程状态标识是指在进程描述符中状态位的值. 进程,也可被称为任务,是指一个程序运行的实例. ...
- 七、IntelliJ IDEA 常见文件类型的图标介绍
咱们已经了解了很多关于 IntelliJ IDEA 的内容啦,例如,在 Windows 系统下安装 IntelliJ IDEA.运行 IntelliJ IDEA .创建 Java 项目以及修改 Int ...
- SiteMesh配置下载使用(简单介绍)
简单介绍 SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的. Sitemesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架 ...
- serlvet配置xml和@WebServlet
简单介绍 XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感.例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web-app元素必须是第三项.在web-app元 ...
- POJ 3616 Milking Time(加掩饰的LIS)
传送门: http://poj.org/problem?id=3616 Milking Time Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- WSASocket()与Socket()的区别 转
/**************************************************** WSASocket是Windows专用,支持异步操作:socket是unix标准,只能同步操 ...
- PC Android IOS资料同步更新
在程序发布后,特别是IOS版本,想替换里边的内容,重新发布版本很是麻烦.我们就可以动态用AssetBundle更新内容. 如果是自定义二进制文件,先要改为“.Bytes”后缀的文件,Unity会把这个 ...
- ionic 安装步骤
安装ionic和cordova 1,需要首先安装好nodejs,然后通过npm来安装 npm install -g cordova ionic 注意:可能遇到的错误:Error: Cannot fi ...