1---
2title: Debug logging
3---
4
5By default ExoPlayer only logs errors. To log player events, the `EventLogger`
6class can be used. The additional logging it provides can be helpful for
7understanding what the player is doing, as well as for debugging playback
8issues. `EventLogger` implements `AnalyticsListener`, so registering an instance
9with an `ExoPlayer` is easy:
10
11```
12player.addAnalyticsListener(new EventLogger());
13```
14{: .language-java}
15
16The easiest way to observe the log is using Android Studio's [logcat tab][]. You
17can select your app as debuggable process by the package name (
18`com.google.android.exoplayer2.demo` if using the demo app) and tell the logcat
19tab to log only for that app by selecting 'show only selected application'. It's
20possible to further filter the logging with the expression
21`EventLogger|ExoPlayerImpl`, to get only logging from `EventLogger` and the
22player itself.
23
24An alternative to using Android Studio's logcat tab is to use the console. For
25example:
26
27~~~
28adb logcat EventLogger:* ExoPlayerImpl:* *:s
29~~~
30{: .language-shell}
31
32### Player information ###
33
34The `ExoPlayerImpl` class delivers two important lines about the player version,
35the device and OS the app is running on and the modules of ExoPlayer that have
36been loaded:
37
38```
39ExoPlayerImpl: Release 2cd6e65 [ExoPlayerLib/2.12.0] [marlin, Pixel XL, Google, 26] [goog.exo.core, goog.exo.ui, goog.exo.dash]
40ExoPlayerImpl: Init 2e5194c [ExoPlayerLib/2.12.0] [marlin, Pixel XL, Google, 26]
41```
42
43### Playback state ###
44
45Player state changes are logged in lines like the ones below:
46
47```
48EventLogger: playWhenReady [eventTime=0.00, mediaPos=0.00, window=0, true, USER_REQUEST]
49EventLogger: state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING]
50EventLogger: state [eventTime=0.93, mediaPos=0.00, window=0, period=0, READY]
51EventLogger: isPlaying [eventTime=0.93, mediaPos=0.00, window=0, period=0, true]
52EventLogger: playWhenReady [eventTime=9.40, mediaPos=8.40, window=0, period=0, false, USER_REQUEST]
53EventLogger: isPlaying [eventTime=9.40, mediaPos=8.40, window=0, period=0, false]
54EventLogger: playWhenReady [eventTime=10.40, mediaPos=8.40, window=0, period=0, true, USER_REQUEST]
55EventLogger: isPlaying [eventTime=10.40, mediaPos=8.40, window=0, period=0, true]
56EventLogger: state [eventTime=20.40, mediaPos=18.40, window=0, period=0, ENDED]
57EventLogger: isPlaying [eventTime=20.40, mediaPos=18.40, window=0, period=0, false]
58```
59
60In this example playback starts 0.93 seconds after the player is prepared. The
61user pauses playback after 9.4 seconds, and resumes playback one second later at
6210.4 seconds. Playback ends ten seconds later at 20.4 seconds. The common
63elements within the square brackets are:
64
65* `[eventTime=float]`: The wall clock time since player creation.
66* `[mediaPos=float]`: The current playback position.
67* `[window=int]`: The current window index.
68* `[period=int]`: The current period in that window.
69
70The final elements in each line indicate the value of the state being reported.
71
72### Media tracks ###
73
74Track information is logged when the available or selected tracks change. This
75happens at least once at the start of playback. The example below shows track
76logging for an adaptive stream:
77
78```
79EventLogger: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0,
80EventLogger:   group [
81EventLogger:     [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES
82EventLogger:     [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES
83EventLogger:     [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES
84EventLogger:     [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES
85EventLogger:     [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES
86EventLogger:   ]
87EventLogger:   group [
88EventLogger:     [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES
89EventLogger:     [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES
90EventLogger:   ]
91EventLogger: ]
92```
93
94In this example, the player has selected four of the five available video
95tracks. The fifth video track is not selected because it exceeds the
96capabilities of the device, as indicated by `supported=NO_EXCEEDS_CAPABILITIES`.
97The player will adapt between the selected video tracks during playback. When
98the player adapts from one track to another, it's logged in a line like the one
99below:
100
101```
102EventLogger: downstreamFormat [eventTime=3.64, mediaPos=3.00, window=0, period=0, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0]
103```
104
105This log line indicates that the player switched to the 640x360 resolution video
106track three seconds into the media.
107
108### Decoder selection ###
109
110In most cases ExoPlayer renders media using a `MediaCodec` acquired from the
111underlying platform. When a decoder is initialized, this is logged in lines like
112the ones below:
113
114```
115EventLogger: videoDecoderInitialized [0.77, 0.00, window=0, period=0, video, OMX.qcom.video.decoder.avc]
116EventLogger: audioDecoderInitialized [0.79, 0.00, window=0, period=0, audio, OMX.google.aac.decoder]
117```
118
119[logcat tab]: https://developer.android.com/studio/debug/am-logcat
120