「你寫log了沒?」python
「你寫log了沒?」git
「你寫log的時間到一個小時了沒?沒有的話再去寫log」shell
log密度: 大概每100行有10個 -- 由於平均每一百行code會產生10個左右潛在的關鍵節點(同時100行可能有6-8個bug點)。log多多益善,以前的努力是以後的欣慰。bash
從coding的角度講,永遠避免寫暫時的code,包括繪圖的code,處理數據的code,超過30行就要考慮打包而且寫詳細的文檔。若是超過10個函數,考慮生成大文檔。編輯器
熟練掌握全部工具語言的輸入輸出I/O函數。分佈式
天天可能產生上千行的log。爲了不混亂,全部當天的log都dump到一個或者多個只以日期命名的文件中。
請熟練運用各類命令行文檔查找,編輯器regex查詢,以及寫Python腳本提取單個task的log片斷。函數
Python:工具
臨時:測試
print("a has been incremented 1. \n", file="log.txt")
集中管理:命令行
from time import localtime, strftime def log(msg="", mute=0): print(msg, file="log_%s.txt" % strftime("%b%d_%H%M%S", localtime())) # "%b%d_%H%M%S ": 'Mar20_150921'
LOG FILE FOR DATE: 03/19/2019 ========================== time start: %s task: %s source code file: %s output files: ========================== time hh:MM:ss: (checkpoint) (stdout, stderr) time hh:MM:ss: (checkpoint) (stdout, stderr) ... ========================== time start: %s task: %s source code file: %s output files: ========================== time hh:MM:ss: (checkpoint) (stdout, stderr)
echo "python run.py" | at 4:00 atq # get job ids at -d <job-id> # cancel job
任何分佈式環境都適用的一個風格:每一個文件保存本身的header,而不是用一箇中央索引來整合和記錄。
所以最有效的整合零散實驗數據的方法,是在每個的首行記錄詳細信息,而且標註好各個數據項。
命名一概:test_
方便git提交的時候寫入.gitignore
將須要運行的參數保存在一個外部文件,而不是臨時寫在代碼裏。(待實踐)
若是對參數沒有事先要求/偏好, e.g. 採起地毯式搜索最優參數,能夠將參數亂序後分配給不一樣的進程/線程而不是順序分配,這樣任什麼時候刻獲得的數據都有必定表明性
保存參數運行信息,查看具體參數運行時間,估計整體運行時間。在運行函數中加入如下語句將參數的開始運行和結束時間輸出到文件:
def run(): # the func to be run by each thread/process with open("log.txt", "a+") as f: f.write("params <params> begin at <time stamp sec>\n") ... with open("log.txt", "a+") as f: f.write("params <params> finish at <time stamp sec>\n")
而後對文件進行清理:
import re import time import sys sys.stdout = open("log/running_log_clean%d.txt" % time.time()) # ['MK', 'batch_all', './log/%s2019_%sNetwork_%s_core%s.txt', (1, 0), 3, 1000, 2, 50, (0.1, 0.6), 0.02, 0.12000000000000001] param_text = re.compile(r"\[.+\]") param_dic = dict() with open("log/running_log.txt", 'r') as f: line = f.readline() while line: param_raw = re.findall(param_text, line)[0] param_dic.setdefault(param_raw, dict()) if param_raw: if re.findall(r"begin", line): param_dic[param_raw]["start_time"] = re.findall(r'1553......', line)[0] # year 2019 elif re.findall(r"finish", line): param_dic[param_raw]["end_time"] = re.findall(r'1553......', line)[0] print("param %s finish in %d secs", param_raw, param_dic[param_raw]["end_time"] - param_dic[param_raw]["start_time"]) else: print("param %s running for %d secs", param_raw, round(time.time()) - param_dic[param_raw]["start_time"]) line = f.readline()
from multiprocessing import Process import os import sys def info(title): print title print 'module name:', __name__ print 'parent process:', os.getppid() print 'process id:', os.getpid() def f(name): sys.stdout = open(str(os.getpid()) + ".out", "w") info('function f') print 'hello', name if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() q = Process(target=f, args=('fred',)) q.start() p.join() q.join() # output ''' $ ls m.py $ python m.py $ ls 27493.out 27494.out m.py $ cat 27493.out function f module name: __main__ parent process: 27492 process id: 27493 hello bob $ cat 27494.out function f module name: __main__ parent process: 27492 process id: 27494 hello fred '''