2010-11-08 44 views
22

Tôi đang gặp một chút khó khăn khi định cấu hình ghi nhật ký Android. Dưới đây là những gì mã của tôi trông giống như:Mức ghi nhật ký Android

if (Log.isLoggable("MY_TAG", Log.VERBOSE)) { 
     Log.v("MY_TAG", "Here's a log message"); 
    } 

Khá đơn giản, phải không?

Tuy nhiên, tôi gặp khá nhiều khó khăn khi nhận được Log.isLoggable("MY_TAG", Log.VERBOSE) để trả về true.

mỗi http://developer.android.com/reference/android/util/Log.html, tôi đã cố gắng thêm một tập tin local.prop vào/data/thư mục đó trông như thế này:

log.tag.MY_TAG=VERBOSE 

nhưng không có may mắn. Tôi cũng đã thử:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE)); 

nhưng cũng không hoạt động.

Mọi ý tưởng về những gì tôi đang làm sai ở đây? Tôi đang chạy Android 2.1-update1 trên Nexus 1 nếu điều đó tạo ra bất kỳ sự khác biệt nào.

Trả lời

30

Hãy thử

adb shell setprop log.tag.MyAppTag VERBOSE 
+2

Công trình này !!! Nó sẽ thực sự ngọt ngào nếu bạn có thể thay đổi các thuộc tính shell này thông qua một lời gọi System.setProperty trong Java. – seanoshea

+1

Lưu ý các giá trị thuộc tính được đặt như cài lại này sau khi khởi động lại thiết bị. Vì vậy, bạn sẽ phải nhập lại lệnh nếu bạn cần. –

+0

Nếu bạn có ứng dụng Tasker (một vài đô la trên Cửa hàng Play), bạn có thể chạy lệnh này khi thiết bị của bạn khởi động bằng cách tạo cấu hình mới với sự kiện = Hệ thống> Khởi động thiết bị và mã tác vụ> Chạy Shell với lệnh = "setprop log.tag.MyAppTag VERBOSE ". Tôi đã phải chạy lệnh như là người chủ (kiểm tra hộp trong Tasker) để làm cho nó hoạt động. –

9

Một mục tiêu quan trọng là không vận chuyển một ứng dụng sản xuất với một tấn của các cuộc gọi đăng nhập còn lại trong nó, làm tăng kích thước của nó, và thậm chí thậm chí có thể ảnh hưởng đến hiệu quả của nó.

Để làm điều này, đề nghị của tôi là để đưa những hằng số ở đầu mỗi lớp có nghĩa là sẽ có các cuộc gọi đăng nhập:

static final boolean DEBUG = false; 
static final String TAG = "<MyClass>" 

Bây giờ nơi bạn đăng nhập, thực hiện điều này:

if (DEBUG) Log.v(TAG, "Something"); 

Bật nhật ký của bạn bằng cách thay đổi hằng số DEBUG thành true. (Nếu bạn muốn, bạn có thể có một lớp học với các thống kê này cho tất cả mã ứng dụng của bạn để sử dụng ... Điều đó có ý nghĩa đối với một ứng dụng nhỏ, nhưng khi mọi thứ trở nên lớn thì nên quyết định phần nào để bật tính năng đăng nhập.)

Bằng cách làm điều này, khi bạn tạo ứng dụng của mình với DEBUG = false, tất cả mã đăng nhập của bạn không chỉ không được thực hiện mà còn bị xóa hoàn toàn khỏi ứng dụng của bạn. Điều này là tốt đẹp bởi vì nó cho phép bạn để lại đăng nhập khá rộng rãi trong mã của bạn để được bật khi bạn cần nó, mà không đáng lo ngại về cách đó sẽ ảnh hưởng đến kích thước của ứng dụng vận chuyển của bạn. Về cơ bản chỉ cần ném các bản ghi ở bất cứ nơi nào bạn cần chúng và đừng lo lắng về việc để chúng vào.

Đây là cách tiếp cận mà rất nhiều khung công tác của Android thực hiện. Ví dụ: Activity ManagerService.

Điều này có các hằng số ở trên cùng và các dòng nhật ký khác nhau được rải đều trên chúng. (Và một loạt các hằng số phụ gỡ lỗi khác cho các khía cạnh khác nhau của nó, vì tệp này cực kỳ ngu xuẩn lớn.)

+5

Lưu ý rằng bạn có thể sử dụng 'BuildConfig.DEBUG', thay vì' DEBUG' của riêng bạn, trên các phiên bản gần đây của các công cụ phát triển (chắc chắn trong R20 và hơn thế nữa). – CommonsWare

+1

@hackbod sau đó làm thế nào chúng ta, khi một người kiểm tra báo cáo một cái gì đó, nhìn vào các bản ghi và mong đợi để tìm thấy bất cứ điều gì? Nó sẽ là tốt hơn để bật DEBUG tại thời gian chạy - nhưng làm thế nào? – likejiujitsu

17

Dường như các phiên bản sau của Android muốn /data/local.prop chỉ có thể ghi được bằng root. Lệnh adb push xuất hiện ban đầu tạo tệp với cấp cho mọi người quyền truy cập đọc/ghi (vì mặt nạ tệp mặc định là 777). Android, một cách khôn ngoan, bỏ qua /data/local.prop vì điều này có thể là một nguy cơ bảo mật.

Tôi chỉ thử nghiệm với Android 2.3.3 và 4.1.2.Trước đây không có vấn đề gì với việc đọc một số local.prop có thể ghi trên thế giới, trong khi sau đó dường như âm thầm bỏ qua nội dung của tệp.

Tạo một file local.prop như mô tả trong câu hỏi ban đầu:

log.tag.MY_TAG=VERBOSE 

Và sau đó đẩy nó vào thiết bị như sau dường như làm các trick:

adb push local.prop /data/local.prop 
adb shell chmod 644 /data/local.prop 
adb shell chown root.root /data/local.prop 
adb reboot 

Bạn có thể tăng gấp đôi kiểm tra để chắc chắc chắn rằng các giá trị trong local.prop được đọc bằng cách thực thi:

adb shell getprop | grep log.tag 

Vì vậy, tóm lại:

  • /data/local.prop chỉ được đọc khi khởi động.
  • Phiên bản sau của Android có vẻ như yêu cầu quyền trên tệp /data/local.prop phải được đặt chính xác hoặc không được đọc. Tệp chỉ có thể ghi được bằng root.

Sử dụng adb shell setprop log.tag.MyAppTag VERBOSE cũng hoạt động. Vấn đề là các giá trị thuộc tính bị mất sau khi khởi động lại.

+2

Có cách nào để thực hiện điều này cho tất cả các thẻ nhật ký, mà không phải đánh vần từng thẻ một cách rõ ràng không? Tôi đang làm việc trên một ứng dụng mà thẻ thường được đặt thành tên lớp, vì vậy có rất nhiều thẻ. – markproxy

Các vấn đề liên quan