0

Google アナリティクスはプライバシーに関する多くの懸念を引き起こす可能性があるため、イベント ロガーを実装しました。

私の最初のアイデアは、ユーザーが生成したイベントをログファイルに追跡し、システム管理者とアプリケーション エンジニアのためにデータの分析を実行するサーバーに送り返すことです。

現時点では、Logger をApplicationまたはServiceクラスにインスタンス化し、それらの要素を使用onCreateonDestroyて、LogFile を安全に処理することを考えています。

解決策は非常に簡単です。

  1. ファイルを開く
  2. イベントが生成されるたびに追加する
  3. aMAX_NUM_LINESに到達したら、ログをサーバーに送信します (おそらく、生成しているテキスト ファイルを圧縮します)。

あなたが知っているかもしれないことに気づいていない、野生ですでに焼かれているものがあるのだろうか( のようなものACRA)。すべての貢献は高く評価されます。

4

1 に答える 1

0

ここで私の実装。ただし、より良いバージョンは大歓迎です。TSG オブジェクトは、私がタイム マネージャーとして使用する単なる静的クラスです。

変更を再投稿/編集する限り、コードを使用して改善してください。

public class Logger {
    private BufferedWriter logFile;
    private String nameFile;
    public int fileLines;
    private File fTemp;
    private timeStampGenerator TSG;
    private int LOG_LINES_LIMIT = 100;
    private Object mutex;

    public enum EventType {
        BUTTON_PRESSED, 
        PAGE_VIEWED, 
        LOADED_ACTIVITY,  
        GENERIC_EVENT
    }

    public Logger (String fileName) throws IOException {
        nameFile = fileName;

        createLogFile();

        fileLines = countLines();

        TSG = new timeStampGenerator();

        // This is our mutex to access to the file
        mutex = new Object();
    }


    public void createLogFile() throws IOException{
        fTemp = new File (nameFile);

        if (!fTemp.exists()) {
            fTemp.createNewFile();
        }

        logFile = new BufferedWriter(new FileWriter(nameFile, true));

    }

    public void LogEvent(EventType event, String comment, String value) {

        String line = "";
        line += TSG.getTimestampMillis();
        line += ",";
        line += event.name();
        line += ",";

        if (comment != "") {
            line += comment.replaceAll(",", ";");
        } else {
            line += " ";
        }

        line += ",";

        if (value != "") {
            line += value.replaceAll(",", ";");
        } else {
            line += " ";
        }

        line += "\n";

        synchronized (mutex) {
            try {
                logFile.append(line);
            } catch (IOException e) {
                // Do wathever you want here
            }
            fileLines++;
        }
    }


    public int countLines() //throws IOException 
    {
        InputStream is;
        try {
            is = new BufferedInputStream(new FileInputStream(nameFile));
        } catch (FileNotFoundException e1) {
            //let's consider it an empty file
            return 0;
        }


        int count = 0;
        boolean empty = true;


        try {
            int readChars = 0;

            byte[] c = new byte[1024];

            while ((readChars = is.read(c)) != -1) {
                empty = false;
                for (int i = 0; i < readChars; ++i) {
                    if (c[i] == '\n')
                        ++count;
                }
            }
        } catch(IOException e) {
            // Do wathever you want here
        }


        try {
            is.close();
        } catch (IOException e) {
            // Do wathever you want here
        }

        return (count == 0 && !empty) ? 1 : count;
    }


    public boolean isLimitReached() {

        return (fileLines >= LOG_LINES_LIMIT);

    }


    public void close () {
        flush();
        try {
            logFile.close();
        } catch (IOException e) {
            // Do wathever you want here
        }
    }



    /** 
     * clear the content of the file
     */
    public void clearFile() {
        synchronized (mutex) {
            if ( fTemp.delete() ) {
                try {
                    createLogFile();
                } catch (IOException e1) {
                    // Do wathever you want here
                }
            }

        }
    }


    /**
     *  Get the full content of the file
     * @return the content
     */
    public String getContent() {

        StringBuffer fileData = new StringBuffer();

        synchronized (mutex) {
            try {
                BufferedReader reader = new BufferedReader(new FileReader( nameFile ));
                char[] buf = new char[1024];
                int numRead = 0;
                while ((numRead = reader.read(buf)) != -1) {
                    String readData = String.valueOf(buf, 0, numRead);
                    fileData.append(readData);
                }
                reader.close();
            } catch (IOException e) {
                // Do wathever you want here
            }
        }

        return fileData.toString();
    }

    public void flush() {
        try {
            logFile.flush();
        } catch (IOException e) {
            // Do wathever you want here
    }
    }
}
于 2013-06-13T15:11:45.980 に答える