github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/internal/debug/flags.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:40</date> 10 //</624342640711700480> 11 12 13 package debug 14 15 import ( 16 "fmt" 17 "io" 18 "net/http" 19 _ "net/http/pprof" 20 "os" 21 "runtime" 22 23 "github.com/ethereum/go-ethereum/log" 24 "github.com/ethereum/go-ethereum/log/term" 25 "github.com/ethereum/go-ethereum/metrics" 26 "github.com/ethereum/go-ethereum/metrics/exp" 27 "github.com/fjl/memsize/memsizeui" 28 colorable "github.com/mattn/go-colorable" 29 "gopkg.in/urfave/cli.v1" 30 ) 31 32 var Memsize memsizeui.Handler 33 34 var ( 35 verbosityFlag = cli.IntFlag{ 36 Name: "verbosity", 37 Usage: "Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail", 38 Value: 3, 39 } 40 vmoduleFlag = cli.StringFlag{ 41 Name: "vmodule", 42 /*GE:“每个模块的详细程度:逗号分隔的<pattern>=<level>(例如eth/*=5,p2p=4)”, 43 值:“ 44 } 45 backtraceAtFlag=cli.stringFlag_ 46 名称:“回溯”, 47 用法:“在特定的日志记录语句(例如\”block.go:271\“)请求堆栈跟踪”, 48 值:“ 49 } 50 debugflag=cli.boolflag_ 51 名称:“调试”, 52 用法:“用调用站点位置(文件和行号)预先准备日志消息”, 53 } 54 pprofflag=cli.boolflag_ 55 姓名:“PPROF”, 56 用法:“启用pprof http服务器”, 57 } 58 pprofPortFlag=cli.intFlag_ 59 姓名:“PrPopPt”, 60 用法:“pprof http服务器侦听端口”, 61 值:6060, 62 } 63 pprofaddflag=cli.stringflag_ 64 名称:“pprofaddr”, 65 用法:“pprof http服务器侦听接口”, 66 值:“127.0.0.1”, 67 } 68 memprofilerateflag=cli.intflag_ 69 名称:“MemProfileRate”, 70 用法:“以给定速率打开内存分析”, 71 值:runtime.memprofilerate, 72 } 73 blockProfileRateFlag=cli.intFlag_ 74 名称:“blockprofilerate”, 75 用法:“以给定速率打开块分析”, 76 } 77 CpPrPuliFrase= CLI.STRIGLAG { 78 名称:“cpuprofile”, 79 用法:“将CPU配置文件写入给定文件”, 80 } 81 traceFlag=cli.stringFlag_ 82 姓名:“追踪”, 83 用法:“将执行跟踪写入给定文件”, 84 } 85 ) 86 87 //标志保存调试所需的所有命令行标志。 88 var flags=[]cli.flag_ 89 详细标志,vmoduleflag,backtraceatflag,debugflag, 90 pprofFlag、pprofAddFlag、pprofPortFlag 91 memprofilerateflag、blockprofilerateflag、cpupprofileflag、traceflag、 92 } 93 94 var 95 Ostream日志处理程序 96 glogger*日志.gloghandler 97 ) 98 99 函数() 100 usecolor:=term.istty(os.stderr.fd())和os.getenv(“term”)!=“哑巴” 101 输出:=io.writer(os.stderr) 102 如果使用颜色{ 103 输出=可着色。新的可着色stderr() 104 } 105 ostream=log.streamHandler(输出,log.terminalFormat(useColor)) 106 glogger=log.newgloghandler(奥斯特里姆) 107 } 108 109 //St设置基于CLI标志初始化配置文件和日志记录。 110 //应该在程序中尽早调用它。 111 func设置(ctx*cli.context,logdir string)错误 112 /测井 113 log printorigins(ctx.globalbool(debugflag.name))。 114 如果Logdir!=“{” 115 rfh,err:=log.rotatingfilehandler( 116 洛迪尔 117 262144, 118 log.JSONFormatOrderedEx(false, true), 119 ) 120 如果犯错!= nIL{ 121 返回错误 122 } 123 glogger.sethandler(log.multihandler(ostream,rfh))。 124 } 125 glogger.verbosity(log.lvl(ctx.globalint(verbosityflag.name))) 126 glogger.vmodule(ctx.globalString(vmoduleFlag.name))。 127 glogger.backtraceat(ctx.globalstring(backtraceatflag.name))。 128 log.root().sethandler(glogger) 129 130 //分析,跟踪 131 runtime.memprofilerate=ctx.globalint(memprofilerateflag.name) 132 handler.setBlockProfileRate(ctx.globalint(blockProfileRateFlag.name))。 133 如果tracefile:=ctx.globalstring(traceflag.name);tracefile!=“{” 134 如果错误:=handler.startgotrace(tracefile);错误!= nIL{ 135 返回错误 136 } 137 } 138 如果cpufile:=ctx.globalString(cpuProfileFlag.name);cpufile!=“{” 139 if err := Handler.StartCPUProfile(cpuFile); err != nIL{ 140 返回错误 141 } 142 } 143 144 //PPROF服务器 145 如果ctx.globalbool(pprofflag.name) 146 地址:=fmt.sprintf(“%s:%d”,ctx.globalString(pprofaddflag.name),ctx.globalint(pprofportflag.name)) 147 startpprof(地址) 148 } 149 返回零 150 } 151 152 func StartPProf(地址字符串){ 153 //在任何/debug/metrics请求中将go metrics挂接到expvar中,加载所有var 154 //从注册表到ExpVar,并执行常规ExpVaR处理程序。 155 exp.exp(metrics.defaultregistry) 156 HTTP.句柄(“/MeistSe/”,http.StripPrefix(“/MESIZE”和MESIZE)) 157 log.info(“启动pprof服务器”,“addr”,fmt.sprintf(“http://%s/debug/pprof”,address))。 158 转到函数() 159 如果错误:=http.listenandserve(address,nil);错误!= nIL{ 160 log.error(“运行pprof server失败”,“err”,err) 161 } 162 }() 163 } 164 165 //exit停止所有正在运行的配置文件,将其输出刷新到 166 //各自的文件。 167 FUNC退出(){ 168 handler.stopcupprofile()处理程序 169 handler.stopgotrace()。 170 } 171