现在我正在创建一个在发布版本中使用添加的proguard进行测试的应用。 正如您可能想象的那样,我编写和测试的内容与人们使用的内容之间存在一些差异。有时我会得到一个错误报告,说某些东西不起作用。嗯......它对我有用,对吗?
所以,我的想法是编写某种LogManager,将新行写入设备上的文本文件。这是我的实现,基本上有效:
@Application
public class LogManager {
private static final String TAG = LogManager.class.getSimpleName();
private static final String FOLDER_NAME = "/logs/";
private static final String FILE_NAME = "app_logs.txt";
DateTime dateTime;
DateTimeFormatter parser;
String date;
FileOutputStream fileOutputStream;
File logFile;
Gson gson;
@Inject
public LogManager(Gson gson) {
parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
this.gson = gson;
createFile();
}
private void createFile(){
if(isExternalStorageReadable() && isExternalStorageWritable()){
try {
File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+FOLDER_NAME);
path.mkdirs();
logFile = new File(path, FILE_NAME);
logFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void log(Object o){
log(gson.toJson(o));
}
public void log(String text){
dateTime = new DateTime();
date = parser.print(dateTime);
String log = date + " " + text;
try{
fileOutputStream = new FileOutputStream(logFile, true);
fileOutputStream.write(System.getProperty("line.separator").getBytes());
fileOutputStream.write(log.getBytes());
fileOutputStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
public void printLogs(){
StringBuilder text = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(logFile));
String line;
while ((line = br.readLine()) != null) {
text.append(line);
text.append('\n');
}
br.close();
}
catch (IOException e) {
e.printStackTrace();
}
L.d(TAG, text.toString());
}
public void deleteLog(){
L.d(TAG, "Log File deleted: "+logFile.delete());
}
private boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
private boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}
所以是的。但是,我不确定它将如何表现......未来的使用。例如,当我尝试在不同的踏板上使用它时会发生什么?我知道我会的,因为我不能异步下载很多东西。
所以,我的问题是......是否有一些"官方"怎么办呢?也许某种日志库? 或者也许我的代码没问题,只需要一些调整?
编辑: 样品使用。
...
@Inject
LogManager logManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userconfig);
App.getInstance().appComponent.inject(this);
logStuff();
}
private void logStuff(){
logManager.log("abc");
logManager.log("def");
logManager.printLogs();
}
因为我使用Dagger2库,所有类中注入的LogManager应该是同一个实例。
答案 0 :(得分:1)
没有正式的方法可以做到这一点。
您的代码有几个问题:
结论 - 你有很多工作要做。这些提示将帮助您创建正确的记录器。