Linux下時(shí)間記錄工具(arbtt/ulogme,類ManicTime)

tl;dr

Linux下程序運(yùn)行狀態(tài)記錄軟件建議使用ulogme,而不是arbtt!!!
目錄

  1. 文章起源
  2. arbtt介紹
  3. ulogme介紹
  4. uLogMe 新一代產(chǎn)品介紹

1. 起源

切換到Linux環(huán)境下最頭疼的一個(gè)事就是缺少了ManicTime類似的辦公工具,用于記錄每天打開各個(gè)程序和文檔的時(shí)間,文檔和程序的標(biāo)題,以便在日后可以回顧當(dāng)天做了什么。
當(dāng)然,有很多類似的手工記錄工具,開始做一件事情之前通過軟件記錄一個(gè)時(shí)間點(diǎn)和內(nèi)容,隨后再檢索,但是太麻煩了,需要頻繁的人工參與操作。
之前在Windows上用的最舒服的一個(gè)軟件就是ManicTime,即便是免費(fèi)版本也可以很好的勝任工作,可以檢索出每天都做了什么,操作了什么文檔(這個(gè)非常非常關(guān)鍵!!!也是我一直需要的功能,可以檢索出當(dāng)天參與了什么項(xiàng)目)。可惜它只有Windows和Mac版本,沒有Linux版本。ManicTime軟件截圖(Baidu找了一個(gè)圖,現(xiàn)在已經(jīng)沒有Windows系統(tǒng)了):


ManicTime截圖(from 百度)

切換到Ubuntu后,通過alternativeto.net找到了RescueTime軟件,類似于ManicTime的自動(dòng)記錄軟件,RecueTime是一個(gè)Native app+Remote WebUI結(jié)合的系統(tǒng),數(shù)據(jù)通過本地Native app收集,并傳遞到RescueTime網(wǎng)站(稍微有點(diǎn)不安全,會(huì)泄露一些信息),通過在網(wǎng)站的WebUI上展現(xiàn)數(shù)據(jù)實(shí)現(xiàn)信息的展示,功能非常全面,界面如下:


RescueTime WebUI截圖

截圖Ubuntu頂部標(biāo)題欄的白色十字圖標(biāo)即是RescueTime的Native app。

但是RescueTime免費(fèi)版只能看到每天打開的程序信息,收費(fèi)版才能看到詳細(xì)的文檔名字,我的核心功能需求(回溯每天參與的項(xiàng)目)沒有被滿足!!!

隨后又通過alternativeto.net找到了arbtt,一個(gè)開源的自動(dòng)記錄軟件,看了網(wǎng)站上的一些demo,完全本地運(yùn)行,相對(duì)RescueTime安全很多。而且可以看到打開的文件(核心需求啊!!!),隨后開始研究這個(gè)東西。

2. arbtt介紹

arbtt官網(wǎng)

arbtt由多個(gè)組件組成:

  1. arbtt-capture,負(fù)責(zé)收集打開的程序和文檔標(biāo)題,并記錄在一個(gè)日志文件中
  2. arbtt-stats,負(fù)責(zé)讀取arbtt-capture記錄的日志文件,并通過指定的過濾規(guī)則(配置文件或命令行直接輸入?yún)?shù))顯示出用戶定制的內(nèi)容

通過arbtt-capture和arbtt-stats的有機(jī)組合可以實(shí)現(xiàn)靈活的日常操作工作的顯示。

2.1 arbtt安裝

arbtt已經(jīng)集成到ubuntu的官方倉(cāng)庫(kù),可以直接apt-get安裝。
參考URL:http://arbtt.nomeata.de/#install

  1. 安裝軟件
sudo apt-get install arbtt
  1. 配置程序開機(jī)自啟動(dòng)
    cp /usr/share/doc/arbtt/examples/arbtt-capture.desktop ~/.config/autostart/

  2. 立即啟動(dòng)程序
    arbtt-capture &

  3. 讓arbtt-capture收集一會(huì)信息

  4. 啟動(dòng)arbtt-stats查看收集的信息
    給arbtt-stats一個(gè)基本的配置,讓其正常啟動(dòng)工作:

echo "{\\$idle > 60 ==> tag inactive}" > ~/.arbtt/categorize.cfg

通過arbtt-stats查看收集的信息:

ray@ray-ThinkPad-X250:~/Applications/arbtt-graph/render$ arbtt-stats 
Total time per tag                                                                                                                              
==================
__________________________Tag_|______Time_|_Percentage_
                     Desktop: | 10h24m00s |     100.00
        Program:google-chrome |  4h16m00s |      41.03
Program:gnome-terminal-server |  3h17m00s |      31.57
                   Program:et |  2h10m00s |      20.83

2.2 arbtt-stats使用

arbtt-capture只負(fù)責(zé)數(shù)據(jù)收集,并不能展示數(shù)據(jù),數(shù)據(jù)展示的方法是讀取arbtt-capture收集的log文件,官方提供的工具是一個(gè)CLI工具,arbtt-stats。

arbtt-stats需要一個(gè)配置文件才能正常工作,這個(gè)配置文件指定了一些過濾和顯示規(guī)則,告訴arbtt-stats顯示哪些log文件的數(shù)據(jù)。

2.3 arbtt-graph

arbtt-graph項(xiàng)目主頁(yè):https://github.com/rejuvyesh/arbtt-graph

arbtt-graph與arbtt-stats功能一樣,都是用于展現(xiàn)arbtt-capture的數(shù)據(jù),不同的是arbtt-stats是CLI顯示,arbtt-graph是WebUI。

arbtt-graph功能較arbtt-stats弱一些,不能操作多個(gè)category,導(dǎo)致不能多維度顯示(程序和標(biāo)題)。

arbtt-graph WebUI截圖

arbtt-graph安裝完成后需要修改如下幾部分,以使其正常工作:

  1. arbtt-graph/update文件
    官方文件要求修改此文件,實(shí)際上只需要確保該文件下如下兩個(gè)字段沒問題即可,一般都是正常的,不用修改:
CATEGORIZE_FILE="./categorize.cfg"      <----與arbtt-stats一樣,需要指定配置文件位置
CATEGORY="Graph"    <----指定arbtt-graph顯示那個(gè)Category到WebUI,只顯示在此配置的Category

修改后需要執(zhí)行一下這個(gè)文件,./update文件可以直接執(zhí)行。

  1. arbtt-graph/categorize.cfg文件
    arbtt-graph的配置文件(過濾規(guī)則),用于指明WebUI顯示的內(nèi)容,作用范圍除了Barcode view外的所有內(nèi)容。
    Paste_Image.png

    將需要通過WebUI顯示的Tag分配到上述update文件指定的Category下,如默認(rèn)的是Graph,我的配置如下,與arbtt-stats文件的規(guī)則和內(nèi)容可以完全一樣:
ray@ray-ThinkPad-X250:~/Applications/arbtt-graph$ cat categorize.cfg 
-- -*- mode: haskell; -*-
$idle > 60 ==> tag inactive,
current window $program == ["gnome-terminal-server"]  ==> tag Graph:term,
current window $program == "et"  ==> tag Graph:office,
current window $program == "wpp"  ==> tag Graph:office,
current window $program == "wps"  ==> tag Graph:office,
current window $program == ["Navigator", "chromium", "google-chrome"] && !(current window $title =~ [m!YouTube!, m!Vimeo!, m!Facebook!, m!Google+!, m!Twitter!, /.*Hacker News.*/, /.*Less Wrong.*/, /.*[Rr]eddit.*/, /.*Goodreads.*/, /.*GitHub.*/, /.*Ask.fm.*/, /.*Ino[Rr]eader.*/, /.*Gmail.*/, /.*New\\ Tab.*/]) ==> tag Graph:browsing,
current window $title =~ [/.*irssi.*/, /.*WeChat.*/] ==> tag Graph:irc,
current window $title =~ /.*pdf.*/ ==> tag Graph:read-pdf,
current window $title =~ /.*djvu.*/ ==> tag Graph:read-djvu,
current window $title =~ /.*epub.*/ ==> tag Graph:read-epub,
current window $title =~ /.*mobi.*/ ==> tag Graph:read-mobi,
current window $title =~ /.*azw3.*/ ==> tag Graph:read-azw3,
current window $title =~ /.*Spreadsheets.*/ ==> tag Graph:office,
current window $title =~ /.*Writer.*/ ==> tag Graph:office,
current window $title =~ [m!mp4!, m!mkv!, m!avi!] ==> tag Graph:tv-local,
tag Graph:$current.program,
  1. arbtt-graph/render/settings.js文件
    用于指定哪些Tag顯示到Barcode上,Barcode就是arbtt-graph主頁(yè)面最下邊的長(zhǎng)條圖:


    Barcode view

    我的配置如下:

ray@ray-ThinkPad-X250:~/Applications/arbtt-graph/render$ cat settings.js
// Barcode view settings
var display_groups = [];
display_groups.push(["social", "misc", "browsing", "office", "term"]);
  1. 修正arbtt-graph/render/overview/overview.html頁(yè)面顯示問題,默認(rèn)該頁(yè)面因?yàn)樽兞颗渲缅e(cuò)誤,導(dǎo)致圖示的x軸太短,看不到(并不是沒有數(shù)據(jù)!!!)。


    錯(cuò)誤頁(yè)面,并通過chrome調(diào)試頁(yè)面查看報(bào)錯(cuò)

    需要對(duì)該文件如下部分的變量進(jìn)行修改:

      function drawData() {
        $("#content").empty();
        // draw the legend on top of the svg
        var d3div = d3.select("#content");
        var ldiv = d3div.append("div").attr('class', 'legenddiv');

        for(var i=0; i<tags.length; i++) {
          var pi = ldiv.append('p').text(tags[i]).attr('style', 'color:' + colors[tags[i]]);

          var m = tags[i];
          if(skipdraw[m]) { pi.attr('class', 'skipdrawyes'); }
          else { pi.attr('class', 'skipdrawno'); }
          
          pi.on('click', function(i) { // close over index i
            return function() {
              // toggle whether this one gets drawn
              var m = tags[i];
              if(skipdraw[m] === false) { skipdraw[m] = true; }
              else { skipdraw[m] = false; }
              drawData(); // and redraw the graph!
            }
          }(i));
        }

        var margin = {top: 10, right:10, bottom: 100, left: 40};

        //var fullwidth = 30;
        //console.log(loglist.length * 15)
        var fullwidth = loglist.length * 150;     <----------修改行
        var fullheight = 800;
        var width = fullwidth - margin.left - margin.right;
        var height = fullheight - margin.top - margin.bottom;

其中var fullwidth = loglist.length * 150;為修改后的內(nèi)容,原值為var fullwidth = loglist.length * 15;,太小了,導(dǎo)致下邊的代碼調(diào)用結(jié)果為負(fù)值,進(jìn)而報(bào)錯(cuò),顯示失敗。

這個(gè)arbtt-graph的參考系統(tǒng)是ulogme,幾乎代碼就是copy過來的,改了少許,可以在Github上看一下源系統(tǒng)的相應(yīng)代碼:
ulogme對(duì)應(yīng)代碼:

      var margin = {top: 10, right: 10, bottom: 100, left: 40};
      var fullwidth = 1200;
      var fullheight = 800;
      var width = fullwidth - margin.left - margin.right;
      var height = fullheight - margin.top - margin.bottom;

3. ulogme介紹和使用

URL:https://github.com/karpathy/ulogme
arbtt和arbtt-graph的默認(rèn)合作模式只展示程序的打開狀況,記錄每個(gè)程序的運(yùn)行時(shí)間和頻率,但這并不是我的使用初衷,雖然可以通過調(diào)整category.cfg文件變相實(shí)現(xiàn)文檔打開情況的展示,但是畢竟這不是該軟件的設(shè)計(jì)初衷,所以實(shí)現(xiàn)起來也挺別扭。自己修改Javascript太耗費(fèi)精力,所以有了arbtt-graph的參考系統(tǒng)ulogme的使用介紹。

ulogme是類似于arbtt的開源軟件,該軟件集成了arbtt-capture和arbtt-graph的功能,原生提供WebUI用于展示。
與arbtt不同的是,ulogme使用的是wmctrl工具包,更多的是截獲打開的程序標(biāo)題,進(jìn)而處理獲取文檔及應(yīng)用程序打開情況。

3.1 ulogme相對(duì)于arbtt的優(yōu)勢(shì)

  • 提供了原生的文檔名稱記錄,更可貴的是與程序名稱關(guān)聯(lián)在一起,即滿足了文檔名稱查看的要求,也不影響頁(yè)面的觀感。
  • 提供了更多的功能:
    • 按鍵記錄(我本人并不使用)
    • 筆記記錄(非常有用的功能,可以針對(duì)當(dāng)天進(jìn)行記錄,也可以針對(duì)某個(gè)時(shí)間點(diǎn)的開啟程序進(jìn)行記錄,非常方便。

3.2 安裝

  1. 獲取軟件源碼
    $ git clone https://github.com/karpathy/ulogme.git
  2. 安裝依賴包
    $ sudo apt-get install xdotool wmctrl
  3. 構(gòu)建配置文件
    $ cp render/render_settings_example.js render/render_settings.js
    修改配置文件
  4. 運(yùn)行監(jiān)控截取程序
    $ ./ulogme.sh
  5. 運(yùn)行WebUI Server
    $ python ulogme_serve.py
  6. 通過瀏覽器打開ulogme WebUI界面
    http://localhost:8124

3.3 配置優(yōu)化

  1. ulogme系統(tǒng)分析
    ulogme系統(tǒng)要比arbtt復(fù)雜, 除了開啟程序和文檔的記錄外,它還實(shí)現(xiàn)了按鍵頻率的統(tǒng)計(jì),用于更深入的實(shí)現(xiàn)程序的跟蹤記錄。但是這個(gè)功能我本人并不感冒,而且記錄按鍵部分的script(單獨(dú)的scirpt)在監(jiān)控功能啟動(dòng)時(shí)還需要root權(quán)限,不安全且不方便制作開機(jī)啟動(dòng)腳本,所以我就修改跳過了這個(gè)功能。
    兩個(gè)腳本名稱:keyfreq.sh(按鍵監(jiān)控)logactivewin.sh(程序標(biāo)題監(jiān)控)

  2. 開機(jī)啟動(dòng)配置
    通過上一節(jié)的介紹,我們知道了ulogme包含按鍵監(jiān)控程序標(biāo)題監(jiān)控兩個(gè)部分,因?yàn)槲也恍枰存I監(jiān)控的功能,且按鍵監(jiān)控啟動(dòng)需要root權(quán)限,為了方便設(shè)置開機(jī)啟動(dòng),我的開機(jī)啟動(dòng)腳本就直接調(diào)用 logactivewin.sh(程序標(biāo)題監(jiān)控)了。
    在 ~/.config/autostart/目錄下建立ulogme.desktop文件:

ray@ray-ThinkPad-X250:~/.config/autostart$ ls
arbtt-capture.desktop  rescuetime.desktop  ulogme.desktop
ray@ray-ThinkPad-X250:~/.config/autostart$ cat ulogme.desktop 
[Desktop Entry]
Encoding=UTF-8
Name=ulogme Data Capture Program
#Icon=
Comment=Records information about the user application usage
Type=Application
#Categories=
Exec=sh -c "cd /home/ray/Applications/ulogme && ./logactivewin.sh"
Terminal=false
StartupNotify=false
ray@ray-ThinkPad-X250:~/.config/autostart$ 
  1. 為Portal頁(yè)面(python腳本)建立ulogme8124.desktop文件(8124是端口號(hào),打開的時(shí)候可以作為提醒),需要注銷系統(tǒng)以便生效。
ray@ray-ThinkPad-X250:~/.local/share/applications$ cat ulogmePortal.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Type=Application
Name=ulogme8124
Exec=sh -c "cd /home/ray/Applications/ulogme && python ./ulogme_serve.py"
  1. HTML頁(yè)面優(yōu)化
    這個(gè)部分主要是對(duì)WebUI的定制和修改,同時(shí)刪掉了按鍵記錄的展示部分,代碼涉及比較多,就不展示了。

3.4 頁(yè)面截圖

ulogme Single-day View
ulogme View

ulogme作者的關(guān)于量化工作效率的文章:Quantifying Productivity

4. uLogMe (next generation of Ulogme)

URL:https://github.com/Naereen/uLogMe
The project currently only works on Ubuntu or Debian-like Linux (for an OSX version, see the original project). It uses the new fancy Promises
feature of ECMAScript 6. This might not be implemented in all browsers, but recent one should have it (recent Chrome and Firefox are fine, at least).


優(yōu)勢(shì)

  1. 更好的UI和性能
  2. 啟動(dòng)腳本本身更完整,可以跨目錄直接調(diào)用,直接調(diào)用做開機(jī)自啟動(dòng),相關(guān)腳本目錄:
  • scripts/ulogme_data.sh 數(shù)據(jù)記錄功能啟動(dòng)腳本。可以單獨(dú)直接啟動(dòng),運(yùn)行所有窗口名按鍵記錄功能。開機(jī)記錄功能需要將此腳本加入啟動(dòng)項(xiàng)
  • scripts/ulogme_serve.sh 數(shù)據(jù)展示功能記錄腳本,腳本內(nèi)配置WEB服務(wù)的IP地址、端口號(hào)(默認(rèn)8443端口)等信息。可以單獨(dú)直接啟動(dòng),運(yùn)行UI Web展示服務(wù)器功能。即使的查看WEB UI需要為此腳本建立.desktop文件
  • ulogme_tmux.sh 集合啟動(dòng)腳本,僅支持在tmux環(huán)境下運(yùn)行。自動(dòng)運(yùn)行上述兩個(gè)腳本,并獨(dú)立的窗口雙屏顯示上述兩個(gè)腳本運(yùn)行的結(jié)果。
  1. 依舊需要自己建立.desktop文件,需要注銷系統(tǒng)以生效。
ray@ray-ThinkPad-X250:~/.local/share/applications$ cat ulogmePortal.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Type=Application
Name=ulogme8443
Exec=/home/ray/Applications/ulogme2/scripts/ulogme_serve.sh
  1. 代碼備份和升級(jí)

只需要備份render/js/render/js/render_settings.js文件即可,該文件記錄UI中應(yīng)用分類的對(duì)應(yīng)關(guān)系。
在備份上述文件的基礎(chǔ)上,可以隨時(shí)git同步官方的代碼更新,不能更好!!!

自動(dòng)調(diào)用瀏覽器查看WEB UI
scripts/ulogme_serve.sh 中包含了調(diào)用瀏覽器的腳本命令,讓操作更方便。但默認(rèn)是調(diào)用的firefox,修改其使用chrome,這個(gè)是對(duì)原代碼的第1個(gè)修改:

修改默認(rèn)的瀏覽器,并設(shè)置自動(dòng)打開

調(diào)整PiaChart顯示大小
修改index.html

            series: [{
                name: "Work balance",
                data: groupsData,
                size: "30%",  // ray original: 45%
                innerSize: "70%",
                dataLabels: {
                    formatter: function () {
                        return this.y >= 0 ? this.point.name.toUpperCase() + "<br>" + strTimeDelta(this.y, false)
                        + ( this.percentage.toFixed(0) >= 2 ? "<br>(<i>" + this.percentage.toFixed(0) + "%</i>)" : "" )
                        : null;
                    },
                    color: "#000000",
                    style: {
                        fontSize: "11pt",
                    },
//ray delete this line. for showing peripheral line for inner text.     Original: distance: -35,
                    rotation: 0,
                },
                allowPointSelect: true, // ray original: false
                showInLegend: true,  // ray original: false
                animation: animate ? {
                    duration: 400,
                } : false,
            }, {
                name: "Activities",
                data: activitiesData,
                size: "90%",    //ray original: 78%
                innerSize: "70%",
                dataLabels: {
                    formatter: function () {
                        // display only if larger than 1
                        return this.y > 1 ? "<b>" + this.point.name + "</b>: " +  strTimeDelta(this.y, false)
                          + ( this.percentage.toFixed(0) >= 2 ? "<br>(<i>" + this.percentage.toFixed(0) + "%</i>)" : "" )
                          : null;
                    },
                    style: {
                        fontSize: "12pt",
                    },
                },
                animation: animate ? {
                    duration: 600,
                } : false,
            }]
        };

安裝步驟
$ git clone https://github.com/Naereen/uLogMe.git
$ sudo apt-get install xdotool xinput wmctrl xprintidle
$ sudo apt install tmux //uLogMe提供的默認(rèn)的啟動(dòng)腳本就是適用的tmux,確實(shí)比較方便,所以直接安裝上吧,節(jié)省時(shí)間
$ cp render/js/render_settings_example.js render/js/render_settings.js
$ mkdir render/json/
$ touch /var/log/pm-suspend.log
$ python export_events.py
$ ./ulogme_tmux.sh //運(yùn)行后的界面如下:

tmux界面

uLogMe 主界面

自啟動(dòng)
非常簡(jiǎn)單,直接加入系統(tǒng)啟動(dòng)項(xiàng)即可:

Paste_Image.png

或者在 ~/.config/autostart/目錄下建立ulogme.desktop文件,自己寫啟動(dòng)腳本,上一章節(jié)有介紹。

文件及目錄介紹

ray@ray-ThinkPad-X250:~/Applications/ulogme2$ ls -al
total 44
drwxr-xr-x  6 ray ray  4096 Dec  6 13:16 .
drwxrwxr-x 11 ray ray  4096 Dec  6 13:06 ..
-rw-r--r--  1 ray ray  1118 Dec  6 13:03 LICENSE
drwxr-xr-x  2 ray ray  4096 Dec  6 13:20 logs
-rw-r--r--  1 ray ray 15066 Dec  6 13:03 README.md
drwxr-xr-x  6 ray ray  4096 Dec  6 13:29 render
drwxr-xr-x  2 ray ray  4096 Dec  6 13:03 screenshots
drwxr-xr-x  4 ray ray  4096 Dec  6 13:18 scripts
  • logs目錄是uLogMe程序記錄的所有裸數(shù)據(jù)。
  • scripts目錄是uLogMe python主程序
  • render目錄下為WEB UI渲染組建。
    • 目錄下的index.html和render/js/下的各類腳本文件實(shí)現(xiàn)對(duì)頁(yè)面的顯示和對(duì)logs目錄下的裸數(shù)據(jù)進(jìn)行挖掘
    • 上述js腳本將挖掘的結(jié)果保存到render/json/下,形成結(jié)構(gòu)化數(shù)據(jù).json文件
    • index.html文件中的js相關(guān)函數(shù)調(diào)用結(jié)構(gòu)化數(shù)據(jù).json文件,實(shí)現(xiàn)數(shù)據(jù)的展示
    • render/js/render_settings.js //主要負(fù)責(zé)UI的展示配置,指明如何對(duì)應(yīng)用分類和顯示,修改此文件后刷新頁(yè)面即看到效果。
      • title-mappings變量指定窗口名稱和用戶自定義名稱的映射


        Paste_Image.png
      • mapwin函數(shù)由index.html中的js函數(shù)進(jìn)行調(diào)用,實(shí)現(xiàn)對(duì)上述title-mappings變量規(guī)則進(jìn)行應(yīng)用


        Paste_Image.png
      • display_group 負(fù)責(zé)對(duì)UI 頁(yè)面中barcode進(jìn)行配置,說明哪些自定義名稱顯示在barcode,以及如何分組顯示


        display_group代碼

        BarCode
      • activity_groups是UI界面上圓形PieChart,分為內(nèi)、外環(huán)。內(nèi)環(huán)是大類,外環(huán)是小類。小類是所有在title-mappings配置映射的自定義名稱(不是只在activity_groups中配置的),大類是在這個(gè)activity_groups中指定的小類進(jìn)行統(tǒng)計(jì)的結(jié)果。


        Paste_Image.png

        piechart

后記:使用Chrome查看js變量值,通過chrome console顯示

chrome有一個(gè)非常好的調(diào)試工具集,可以用于調(diào)試此次overview頁(yè)面的問題,通過工具定位故障點(diǎn),并增加如下參數(shù)打印故障節(jié)點(diǎn)變量值:

Javascript console.log命令
變量跟蹤及故障點(diǎn)定位結(jié)果

其他類似的Linux軟件

  1. Selfspy
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容