Documentation Source Text

Hex Artifact Content
Login

Artifact 6cd8eff4651650b7ba7aa0e0e043d81a30f050f0:


0000: 3c 74 69 74 6c 65 3e 54 68 65 20 45 72 72 6f 72  <title>The Error
0010: 20 41 6e 64 20 57 61 72 6e 69 6e 67 20 4c 6f 67   And Warning Log
0020: 3c 2f 74 69 74 6c 65 3e 0a 3c 74 63 6c 3e 68 64  </title>.<tcl>hd
0030: 5f 6b 65 79 77 6f 72 64 73 20 7b 65 72 72 6c 6f  _keywords {errlo
0040: 67 7d 20 7b 65 72 72 6f 72 20 6c 6f 67 7d 3c 2f  g} {error log}</
0050: 74 63 6c 3e 0a 0a 3c 74 61 62 6c 65 5f 6f 66 5f  tcl>..<table_of_
0060: 63 6f 6e 74 65 6e 74 73 3e 0a 3c 68 32 20 73 74  contents>.<h2 st
0070: 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74  yle="margin-left
0080: 3a 31 2e 30 65 6d 22 20 6e 6f 74 6f 63 20 69 64  :1.0em" notoc id
0090: 3d 6f 76 65 72 76 69 65 77 3e 20 4f 76 65 72 76  =overview> Overv
00a0: 69 65 77 3c 2f 68 32 3e 20 0a 0a 3c 70 3e 53 51  iew</h2> ..<p>SQ
00b0: 4c 69 74 65 20 63 61 6e 20 62 65 20 63 6f 6e 66  Lite can be conf
00c0: 69 67 75 72 65 64 20 74 6f 20 69 6e 76 6f 6b 65  igured to invoke
00d0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63   a callback func
00e0: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  tion containing.
00f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
0100: 64 20 61 20 74 65 72 73 65 20 65 72 72 6f 72 20  d a terse error 
0110: 6d 65 73 73 61 67 65 20 77 68 65 6e 65 76 65 72  message whenever
0120: 20 61 6e 6f 6d 61 6c 69 65 73 20 6f 63 63 75 72   anomalies occur
0130: 2e 0a 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d  ..This mechanism
0140: 20 69 73 20 76 65 72 79 20 68 65 6c 70 66 75 6c   is very helpful
0150: 20 69 6e 20 74 72 61 63 6b 69 6e 67 20 6f 62 73   in tracking obs
0160: 63 75 72 65 20 70 72 6f 62 6c 65 6d 73 20 74 68  cure problems th
0170: 61 74 0a 6f 63 63 75 72 20 72 61 72 65 6c 79 20  at.occur rarely 
0180: 61 6e 64 20 69 6e 20 74 68 65 20 66 69 65 6c 64  and in the field
0190: 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 64  .  Application d
01a0: 65 76 65 6c 6f 70 65 72 73 20 61 72 65 20 65 6e  evelopers are en
01b0: 63 6f 75 72 61 67 65 64 0a 74 6f 20 74 61 6b 65  couraged.to take
01c0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
01d0: 65 20 65 72 72 6f 72 20 6c 6f 67 67 69 6e 67 20  e error logging 
01e0: 66 61 63 69 6c 69 74 79 20 6f 66 20 53 51 4c 69  facility of SQLi
01f0: 74 65 20 69 6e 20 74 68 65 69 72 0a 70 72 6f 64  te in their.prod
0200: 75 63 74 73 2c 20 61 73 20 69 74 20 69 73 20 76  ucts, as it is v
0210: 65 72 79 20 6c 6f 77 20 43 50 55 20 61 6e 64 20  ery low CPU and 
0220: 6d 65 6d 6f 72 79 20 63 6f 73 74 20 62 75 74 20  memory cost but 
0230: 63 61 6e 20 62 65 20 61 0a 68 75 67 65 20 61 69  can be a.huge ai
0240: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  d for debugging.
0250: 3c 2f 70 3e 0a 0a 3c 68 31 3e 53 65 74 74 69 6e  </p>..<h1>Settin
0260: 67 20 55 70 20 54 68 65 20 45 72 72 6f 72 20 4c  g Up The Error L
0270: 6f 67 67 69 6e 67 20 43 61 6c 6c 62 61 63 6b 3c  ogging Callback<
0280: 2f 68 31 3e 0a 0a 3c 70 3e 54 68 65 72 65 20 63  /h1>..<p>There c
0290: 61 6e 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e  an only be a sin
02a0: 67 6c 65 20 65 72 72 6f 72 20 6c 6f 67 67 69 6e  gle error loggin
02b0: 67 20 63 61 6c 6c 62 61 63 6b 20 70 65 72 20 70  g callback per p
02c0: 72 6f 63 65 73 73 2e 0a 54 68 65 20 65 72 72 6f  rocess..The erro
02d0: 72 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61  r logging callba
02e0: 63 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ck is registered
02f0: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75   at start-time u
0300: 73 69 6e 67 20 43 2d 63 6f 64 65 0a 73 69 6d 69  sing C-code.simi
0310: 6c 61 72 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  lar to the follo
0320: 77 69 6e 67 3a 0a 0a 3c 62 6c 6f 63 6b 71 75 6f  wing:..<blockquo
0330: 74 65 3e 3c 70 72 65 3e 0a 5b 73 71 6c 69 74 65  te><pre>.[sqlite
0340: 33 5f 63 6f 6e 66 69 67 5d 28 5b 53 51 4c 49 54  3_config]([SQLIT
0350: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 5d 2c 20 65  E_CONFIG_LOG], e
0360: 72 72 6f 72 4c 6f 67 43 61 6c 6c 62 61 63 6b 2c  rrorLogCallback,
0370: 20 70 44 61 74 61 29 3b 0a 3c 2f 70 72 65 3e 3c   pData);.</pre><
0380: 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70  /blockquote>..<p
0390: 3e 54 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65  >The error logge
03a0: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
03b0: 69 6f 6e 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ion might look s
03c0: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
03d0: 69 73 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71  is:</p>..<blockq
03e0: 75 6f 74 65 3e 3c 70 72 65 3e 0a 76 6f 69 64 20  uote><pre>.void 
03f0: 65 72 72 6f 72 4c 6f 67 43 61 6c 6c 62 61 63 6b  errorLogCallback
0400: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
0410: 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74   iErrCode, const
0420: 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
0430: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0440: 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72  "(%d) %s\n", iEr
0450: 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 7d 0a  rCode, zMsg);.}.
0460: 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f  </pre></blockquo
0470: 74 65 3e 0a 0a 3c 70 3e 54 68 65 20 65 78 61 6d  te>..<p>The exam
0480: 70 6c 65 20 61 62 6f 76 65 20 69 6c 6c 75 73 74  ple above illust
0490: 72 61 74 65 73 20 74 68 65 20 73 69 67 6e 61 74  rates the signat
04a0: 75 72 65 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ure of the error
04b0: 20 6c 6f 67 67 65 72 20 63 61 6c 6c 62 61 63 6b   logger callback
04c0: 2e 0a 48 6f 77 65 76 65 72 2c 20 69 6e 20 61 6e  ..However, in an
04d0: 20 65 6d 62 65 64 64 65 64 20 61 70 70 6c 69 63   embedded applic
04e0: 61 74 69 6f 6e 2c 20 6f 6e 65 20 75 73 75 61 6c  ation, one usual
04f0: 6c 79 20 64 6f 65 73 20 6e 6f 74 20 70 72 69 6e  ly does not prin
0500: 74 0a 6d 65 73 73 61 67 65 73 20 6f 6e 20 73 74  t.messages on st
0510: 64 65 72 72 2e 20 20 49 6e 73 74 65 61 64 2c 20  derr.  Instead, 
0520: 6f 6e 65 20 6d 69 67 68 74 20 73 74 6f 72 65 20  one might store 
0530: 74 68 65 20 6d 65 73 73 61 67 65 73 20 69 6e 20  the messages in 
0540: 61 0a 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 63  a.preallocated c
0550: 69 72 63 75 6c 61 72 20 62 75 66 66 65 72 20 77  ircular buffer w
0560: 68 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  here they can be
0570: 20 61 63 63 65 73 73 65 64 20 77 68 65 6e 20 64   accessed when d
0580: 69 61 67 6e 6f 73 74 69 63 0a 69 6e 66 6f 72 6d  iagnostic.inform
0590: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 20  ation is needed 
05a0: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
05b0: 2e 20 20 4f 72 20 70 65 72 68 61 70 73 20 74 68  .  Or perhaps th
05c0: 65 20 6d 65 73 73 61 67 65 73 20 63 61 6e 20 62  e messages can b
05d0: 65 0a 73 65 6e 74 20 74 6f 20 5b 68 74 74 70 3a  e.sent to [http:
05e0: 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61 2e 6f  //en.wikipedia.o
05f0: 72 67 2f 77 69 6b 69 2f 53 79 73 6c 6f 67 20 7c  rg/wiki/Syslog |
0600: 20 53 79 73 6c 6f 67 5d 2e 20 20 53 6f 6d 65 68   Syslog].  Someh
0610: 6f 77 2c 20 74 68 65 0a 6d 65 73 73 61 67 65 73  ow, the.messages
0620: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 74 6f 72   need to be stor
0630: 65 64 20 77 68 65 72 65 20 74 68 65 79 20 61 72  ed where they ar
0640: 65 20 61 63 63 65 73 73 69 62 6c 65 20 74 6f 20  e accessible to 
0650: 64 65 76 65 6c 6f 70 65 72 73 2c 0a 6e 6f 74 20  developers,.not 
0660: 64 69 73 70 6c 61 79 65 64 20 74 6f 20 65 6e 64  displayed to end
0670: 20 75 73 65 72 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e   users.</p>..<p>
0680: 44 6f 20 6e 6f 74 20 6d 69 73 75 6e 64 65 72 73  Do not misunders
0690: 74 61 6e 64 3a 20 54 68 65 72 65 20 69 73 20 6e  tand: There is n
06a0: 6f 74 68 69 6e 67 20 74 65 63 68 6e 69 63 61 6c  othing technical
06b0: 6c 79 20 77 72 6f 6e 67 20 77 69 74 68 20 64 69  ly wrong with di
06c0: 73 70 6c 61 79 69 6e 67 20 0a 74 68 65 20 65 72  splaying .the er
06d0: 72 6f 72 20 6c 6f 67 67 65 72 20 6d 65 73 73 61  ror logger messa
06e0: 67 65 73 20 74 6f 20 65 6e 64 20 75 73 65 72 73  ges to end users
06f0: 2e 20 20 54 68 65 20 6d 65 73 73 61 67 65 73 20  .  The messages 
0700: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 73  do not contain.s
0710: 65 6e 73 69 74 69 76 65 20 6f 72 20 70 72 69 76  ensitive or priv
0720: 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
0730: 74 68 61 74 20 6d 75 73 74 20 62 65 20 70 72 6f  that must be pro
0740: 74 65 63 74 65 64 20 66 72 6f 6d 20 75 6e 61 75  tected from unau
0750: 74 68 6f 72 69 7a 65 64 0a 76 69 65 77 69 6e 67  thorized.viewing
0760: 2e 20 20 52 61 74 68 65 72 20 74 68 65 20 6d 65  .  Rather the me
0770: 73 73 61 67 65 73 20 61 72 65 20 74 65 63 68 6e  ssages are techn
0780: 69 63 61 6c 20 69 6e 20 6e 61 74 75 72 65 20 61  ical in nature a
0790: 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 66 75  nd are not usefu
07a0: 6c 0a 6f 72 20 6d 65 61 6e 69 6e 67 66 75 6c 20  l.or meaningful 
07b0: 74 6f 20 74 68 65 20 74 79 70 69 63 61 6c 20 65  to the typical e
07c0: 6e 64 20 75 73 65 72 2e 20 20 54 68 65 20 6d 65  nd user.  The me
07d0: 73 73 61 67 65 73 20 63 6f 6d 69 6e 67 20 66 72  ssages coming fr
07e0: 6f 6d 20 74 68 65 0a 65 72 72 6f 72 20 6c 6f 67  om the.error log
07f0: 67 65 72 20 61 72 65 20 69 6e 74 65 6e 64 65 64  ger are intended
0800: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 67 65   for database ge
0810: 65 6b 73 2e 20 20 44 69 73 70 6c 61 79 20 74 68  eks.  Display th
0820: 65 6d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 3c  em accordingly.<
0830: 2f 70 3e 0a 0a 3c 68 31 3e 49 6e 74 65 72 66 61  /p>..<h1>Interfa
0840: 63 65 20 44 65 74 61 69 6c 73 3c 2f 68 31 3e 0a  ce Details</h1>.
0850: 0a 3c 70 3e 54 68 65 20 74 68 69 72 64 20 61 72  .<p>The third ar
0860: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 5b 73  gument to the [s
0870: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5d 28 5b  qlite3_config]([
0880: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
0890: 47 5d 2c 2e 2e 2e 29 20 0a 69 6e 74 65 72 66 61  G],...) .interfa
08a0: 63 65 20 28 74 68 65 20 22 70 44 61 74 61 22 20  ce (the "pData" 
08b0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 74 68 65 20  argument in the 
08c0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 29 20 69  example above) i
08d0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
08e0: 72 62 69 74 72 61 72 79 0a 64 61 74 61 2e 20 20  rbitrary.data.  
08f0: 53 51 4c 69 74 65 20 70 61 73 73 65 73 20 74 68  SQLite passes th
0900: 69 73 20 70 6f 69 6e 74 65 72 20 74 68 72 6f 75  is pointer throu
0910: 67 68 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  gh to the first 
0920: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 0a  argument of the.
0930: 65 72 72 6f 72 20 6c 6f 67 67 65 72 20 63 61 6c  error logger cal
0940: 6c 62 61 63 6b 2e 20 20 54 68 65 20 70 6f 69 6e  lback.  The poin
0950: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
0960: 74 6f 20 70 61 73 73 20 61 70 70 6c 69 63 61 74  to pass applicat
0970: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 0a 73 65  ion-specific .se
0980: 74 75 70 20 6f 72 20 73 74 61 74 65 20 69 6e 66  tup or state inf
0990: 6f 72 6d 61 74 69 6f 6e 2c 20 69 66 20 64 65 73  ormation, if des
09a0: 69 72 65 64 2e 20 20 4f 72 20 69 74 20 63 61 6e  ired.  Or it can
09b0: 20 73 69 6d 70 6c 79 20 62 65 20 61 20 4e 55 4c   simply be a NUL
09c0: 4c 20 0a 70 6f 69 6e 74 65 72 20 77 68 69 63 68  L .pointer which
09d0: 20 69 73 20 69 67 6e 6f 72 65 64 20 62 79 20 74   is ignored by t
09e0: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 3c 2f 70 3e  he callback.</p>
09f0: 0a 0a 3c 70 3e 54 68 65 20 73 65 63 6f 6e 64 20  ..<p>The second 
0a00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
0a10: 65 72 72 6f 72 20 6c 6f 67 67 65 72 20 63 61 6c  error logger cal
0a20: 6c 62 61 63 6b 20 69 73 20 61 6e 20 69 6e 74 65  lback is an inte
0a30: 67 65 72 0a 5b 65 78 74 65 6e 64 65 64 20 65 72  ger.[extended er
0a40: 72 6f 72 20 63 6f 64 65 5d 2e 20 20 54 68 65 20  ror code].  The 
0a50: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
0a60: 6f 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 67  o the error logg
0a70: 65 72 20 69 73 20 74 68 65 0a 74 65 78 74 20 6f  er is the.text o
0a80: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
0a90: 61 67 65 2e 20 20 54 68 65 20 65 72 72 6f 72 20  age.  The error 
0aa0: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 73 20  message text is 
0ab0: 73 74 6f 72 65 64 20 69 6e 20 61 20 66 69 78 65  stored in a fixe
0ac0: 64 2d 6c 65 6e 67 74 68 0a 73 74 61 63 6b 20 62  d-length.stack b
0ad0: 75 66 66 65 72 20 69 6e 20 74 68 65 20 63 61 6c  uffer in the cal
0ae0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ling function an
0af0: 64 20 73 6f 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  d so will only b
0b00: 65 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 0a  e valid for the.
0b10: 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  duration of the 
0b20: 65 72 72 6f 72 20 6c 6f 67 67 65 72 20 63 61 6c  error logger cal
0b30: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 20  lback function. 
0b40: 20 54 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65   The error logge
0b50: 72 20 73 68 6f 75 6c 64 0a 6d 61 6b 65 20 61 20  r should.make a 
0b60: 63 6f 70 79 20 6f 66 20 74 68 69 73 20 6d 65 73  copy of this mes
0b70: 73 61 67 65 20 69 6e 74 6f 20 70 65 72 73 69 73  sage into persis
0b80: 74 65 6e 74 20 73 74 6f 72 61 67 65 20 69 66 20  tent storage if 
0b90: 72 65 74 65 6e 74 69 6f 6e 20 6f 66 20 74 68 65  retention of the
0ba0: 0a 6d 65 73 73 61 67 65 20 69 73 20 6e 65 65 64  .message is need
0bb0: 65 64 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20  ed.</p>..<p>The 
0bc0: 65 72 72 6f 72 20 6c 6f 67 67 65 72 20 63 61 6c  error logger cal
0bd0: 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 62 65 20  lback should be 
0be0: 74 72 65 61 74 65 64 20 6c 69 6b 65 20 61 20 73  treated like a s
0bf0: 69 67 6e 61 6c 20 68 61 6e 64 6c 65 72 2e 0a 54  ignal handler..T
0c00: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 73  he application s
0c10: 68 6f 75 6c 64 20 73 61 76 65 20 6f 66 66 20 6f  hould save off o
0c20: 72 20 6f 74 68 65 72 77 69 73 65 20 70 72 6f 63  r otherwise proc
0c30: 65 73 73 20 74 68 65 20 65 72 72 6f 72 2c 20 74  ess the error, t
0c40: 68 65 6e 20 72 65 74 75 72 6e 0a 61 73 20 73 6f  hen return.as so
0c50: 6f 6e 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  on as possible. 
0c60: 20 4e 6f 20 6f 74 68 65 72 20 53 51 4c 69 74 65   No other SQLite
0c70: 20 41 50 49 73 20 73 68 6f 75 6c 64 20 62 65 20   APIs should be 
0c80: 69 6e 76 6f 6b 65 64 2c 20 64 69 72 65 63 74 6c  invoked, directl
0c90: 79 20 6f 72 0a 69 6e 64 69 72 65 63 74 6c 79 2c  y or.indirectly,
0ca0: 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72 20   from the error 
0cb0: 6c 6f 67 67 65 72 2e 20 20 53 51 4c 69 74 65 20  logger.  SQLite 
0cc0: 69 73 20 3c 75 3e 6e 6f 74 3c 2f 75 3e 20 72 65  is <u>not</u> re
0cd0: 65 6e 74 72 61 6e 74 20 74 68 72 6f 75 67 68 0a  entrant through.
0ce0: 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72  the error logger
0cf0: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 49 6e 20 70   callback.  In p
0d00: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 65 20 65  articular, the e
0d10: 72 72 6f 72 20 6c 6f 67 67 65 72 20 63 61 6c 6c  rror logger call
0d20: 62 61 63 6b 0a 69 73 20 69 6e 76 6f 6b 65 64 20  back.is invoked 
0d30: 77 68 65 6e 20 61 20 6d 65 6d 6f 72 79 20 61 6c  when a memory al
0d40: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
0d50: 73 6f 20 69 74 20 69 73 20 67 65 6e 65 72 61 6c  so it is general
0d60: 6c 79 20 61 20 62 61 64 20 69 64 65 61 0a 74 6f  ly a bad idea.to
0d70: 20 74 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65   try to allocate
0d80: 20 6d 65 6d 6f 72 79 20 69 6e 73 69 64 65 20 74   memory inside t
0d90: 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 2e  he error logger.
0da0: 20 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 74 68    Do not even th
0db0: 69 6e 6b 0a 61 62 6f 75 74 20 74 72 79 69 6e 67  ink.about trying
0dc0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 65 72   to store the er
0dd0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 61  ror message in a
0de0: 6e 6f 74 68 65 72 20 53 51 4c 69 74 65 20 64 61  nother SQLite da
0df0: 74 61 62 61 73 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e  tabase.</p>..<p>
0e00: 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 63 61 6e  Applications can
0e10: 20 75 73 65 20 74 68 65 20 5b 73 71 6c 69 74 65   use the [sqlite
0e20: 33 5f 6c 6f 67 28 45 2c 46 2c 2e 2e 29 5d 20 41  3_log(E,F,..)] A
0e30: 50 49 20 74 6f 20 73 65 6e 64 20 6e 65 77 20 6d  PI to send new m
0e40: 65 73 73 61 67 65 73 0a 74 6f 20 74 68 65 20 6c  essages.to the l
0e50: 6f 67 2c 20 69 66 20 64 65 73 69 72 65 64 2c 20  og, if desired, 
0e60: 62 75 74 20 74 68 69 73 20 69 73 20 64 69 73 63  but this is disc
0e70: 6f 75 72 61 67 65 64 2e 20 20 54 68 65 20 5b 73  ouraged.  The [s
0e80: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 5d 0a 69 6e  qlite3_log()].in
0e90: 74 65 72 66 61 63 65 20 69 73 20 69 6e 74 65 6e  terface is inten
0ea0: 64 65 64 20 66 6f 72 20 75 73 65 20 62 79 20 65  ded for use by e
0eb0: 78 74 65 6e 73 69 6f 6e 73 20 6f 6e 6c 79 2c 20  xtensions only, 
0ec0: 6e 6f 74 20 62 79 20 61 70 70 6c 69 63 61 74 69  not by applicati
0ed0: 6f 6e 73 2e 3c 2f 70 3e 0a 0a 3c 68 31 3e 56 61  ons.</p>..<h1>Va
0ee0: 72 69 65 74 79 20 6f 66 20 45 72 72 6f 72 20 4d  riety of Error M
0ef0: 65 73 73 61 67 65 73 3c 2f 68 31 3e 0a 0a 3c 70  essages</h1>..<p
0f00: 3e 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61  >The error messa
0f10: 67 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 62  ges that might b
0f20: 65 20 73 65 6e 74 20 74 6f 20 74 68 65 20 65 72  e sent to the er
0f30: 72 6f 72 20 6c 6f 67 67 65 72 20 61 6e 64 20 74  ror logger and t
0f40: 68 65 69 72 0a 65 78 61 63 74 20 66 6f 72 6d 61  heir.exact forma
0f50: 74 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20  t is subject to 
0f60: 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 6f 6e 65  changes from one
0f70: 20 72 65 6c 65 61 73 65 20 74 6f 20 74 68 65 20   release to the 
0f80: 6e 65 78 74 2e 20 20 53 6f 0a 61 70 70 6c 69 63  next.  So.applic
0f90: 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f  ations should no
0fa0: 74 20 64 65 70 65 6e 64 20 6f 6e 20 61 6e 79 20  t depend on any 
0fb0: 70 61 72 74 69 63 75 6c 61 72 20 65 72 72 6f 72  particular error
0fc0: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 6f   message text fo
0fd0: 72 6d 61 74 73 20 6f 72 0a 65 72 72 6f 72 20 63  rmats or.error c
0fe0: 6f 64 65 73 2e 20 20 54 68 69 6e 67 73 20 64 6f  odes.  Things do
0ff0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 63 61 70 72   not change capr
1000: 69 63 69 6f 75 73 6c 79 2c 20 62 75 74 20 74 68  iciously, but th
1010: 65 79 20 64 6f 20 73 6f 6d 65 74 69 6d 65 73 0a  ey do sometimes.
1020: 63 68 61 6e 67 65 73 2e 3c 2f 70 3e 0a 0a 3c 70  changes.</p>..<p
1030: 3e 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  >The following i
1040: 73 20 61 20 70 61 72 74 69 61 6c 20 6c 69 73 74  s a partial list
1050: 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66   of the kinds of
1060: 20 6d 65 73 73 61 67 65 73 20 74 68 61 74 20 6d   messages that m
1070: 69 67 68 74 0a 61 70 70 65 61 72 20 69 6e 20 74  ight.appear in t
1080: 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 20  he error logger 
1090: 63 61 6c 6c 62 61 63 6b 2e 3c 2f 70 3e 0a 0a 3c  callback.</p>..<
10a0: 75 6c 3e 0a 3c 6c 69 3e 3c 70 3e 0a 41 6e 79 20  ul>.<li><p>.Any 
10b0: 74 69 6d 65 20 74 68 65 72 65 20 69 73 20 61 6e  time there is an
10c0: 20 65 72 72 6f 72 20 65 69 74 68 65 72 20 63 6f   error either co
10d0: 6d 70 69 6c 69 6e 67 20 61 6e 20 53 51 4c 20 73  mpiling an SQL s
10e0: 74 61 74 65 6d 65 6e 74 20 0a 28 75 73 69 6e 67  tatement .(using
10f0: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
1100: 65 5f 76 32 28 29 5d 20 6f 72 20 69 74 73 20 73  e_v2()] or its s
1110: 69 62 6c 69 6e 67 73 29 20 6f 72 20 72 75 6e 6e  iblings) or runn
1120: 69 6e 67 20 61 6e 20 53 51 4c 0a 73 74 61 74 65  ing an SQL.state
1130: 6d 65 6e 74 20 28 75 73 69 6e 67 20 5b 73 71 6c  ment (using [sql
1140: 69 74 65 33 5f 73 74 65 70 28 29 5d 29 20 74 68  ite3_step()]) th
1150: 61 74 20 65 72 72 6f 72 20 69 73 20 6c 6f 67 67  at error is logg
1160: 65 64 2e 0a 3c 2f 70 3e 0a 0a 3c 6c 69 3e 3c 70  ed..</p>..<li><p
1170: 3e 0a 57 68 65 6e 20 61 20 73 63 68 65 6d 61 20  >.When a schema 
1180: 63 68 61 6e 67 65 20 6f 63 63 75 72 73 20 74 68  change occurs th
1190: 61 74 20 72 65 71 75 69 72 65 73 20 61 20 70 72  at requires a pr
11a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
11b0: 20 74 6f 20 62 65 20 72 65 70 61 72 73 65 64 0a   to be reparsed.
11c0: 61 6e 64 20 72 65 70 72 65 70 61 72 65 64 2c 20  and reprepared, 
11d0: 74 68 61 74 20 65 76 65 6e 74 20 69 73 20 6c 6f  that event is lo
11e0: 67 67 65 64 20 77 69 74 68 20 74 68 65 20 65 72  gged with the er
11f0: 72 6f 72 20 63 6f 64 65 20 53 51 4c 49 54 45 5f  ror code SQLITE_
1200: 53 43 48 45 4d 41 2e 0a 54 68 65 20 72 65 70 61  SCHEMA..The repa
1210: 72 73 65 20 61 6e 64 20 72 65 70 72 65 70 61 72  rse and reprepar
1220: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 75  e is normally au
1230: 74 6f 6d 61 74 69 63 20 28 61 73 73 75 6d 69 6e  tomatic (assumin
1240: 67 20 74 68 61 74 0a 5b 73 71 6c 69 74 65 33 5f  g that.[sqlite3_
1250: 70 72 65 70 61 72 65 5f 76 32 28 29 5d 20 68 61  prepare_v2()] ha
1260: 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 70  s been used to p
1270: 72 65 70 61 72 65 64 20 74 68 65 20 73 74 61 74  repared the stat
1280: 65 6d 65 6e 74 73 20 6f 72 69 67 69 6e 61 6c 6c  ements originall
1290: 79 2c 0a 77 68 69 63 68 20 69 73 20 72 65 63 6f  y,.which is reco
12a0: 6d 6d 65 6e 64 65 64 29 20 61 6e 64 20 73 6f 20  mmended) and so 
12b0: 74 68 65 73 65 20 6c 6f 67 67 69 6e 67 20 65 76  these logging ev
12c0: 65 6e 74 73 20 61 72 65 20 6e 6f 72 6d 61 6c 6c  ents are normall
12d0: 79 20 74 68 65 20 6f 6e 6c 79 0a 77 61 79 20 74  y the only.way t
12e0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 72 65 70 72  o know that repr
12f0: 65 70 61 72 65 73 20 61 72 65 20 74 61 6b 69 6e  epares are takin
1300: 67 20 70 6c 61 63 65 2e 3c 2f 70 3e 0a 0a 3c 6c  g place.</p>..<l
1310: 69 3e 3c 70 3e 0a 53 51 4c 49 54 45 5f 4e 4f 54  i><p>.SQLITE_NOT
1320: 49 43 45 20 6d 65 73 73 61 67 65 73 20 61 72 65  ICE messages are
1330: 20 6c 6f 67 67 65 64 20 77 68 65 6e 65 76 65 72   logged whenever
1340: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 73 20   a database has 
1350: 74 6f 20 62 65 20 72 65 63 6f 76 65 72 65 64 0a  to be recovered.
1360: 62 65 63 61 75 73 65 20 74 68 65 20 70 72 65 76  because the prev
1370: 69 6f 75 73 20 77 72 69 74 65 72 20 63 72 61 73  ious writer cras
1380: 68 65 64 20 77 69 74 68 6f 75 74 20 63 6f 6d 70  hed without comp
1390: 6c 65 74 69 6e 67 20 69 74 73 20 74 72 61 6e 73  leting its trans
13a0: 61 63 74 69 6f 6e 2e 0a 54 68 65 20 65 72 72 6f  action..The erro
13b0: 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
13c0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
13d0: 52 4f 4c 4c 42 41 43 4b 20 77 68 65 6e 20 72 65  ROLLBACK when re
13e0: 63 6f 76 65 72 69 6e 67 20 61 0a 5b 72 6f 6c 6c  covering a.[roll
13f0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 5d 20 61 6e  back journal] an
1400: 64 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  d SQLITE_NOTICE_
1410: 52 45 43 4f 56 45 52 5f 57 41 4c 20 77 68 65 6e  RECOVER_WAL when
1420: 20 72 65 63 6f 76 65 72 69 6e 67 20 61 20 0a 5b   recovering a .[
1430: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 5d  write-ahead log]
1440: 2e 0a 3c 2f 70 3e 0a 0a 3c 6c 69 3e 3c 70 3e 0a  ..</p>..<li><p>.
1450: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20 6d  SQLITE_WARNING m
1460: 65 73 73 61 67 65 73 20 61 72 65 20 6c 6f 67 67  essages are logg
1470: 65 64 20 77 68 65 6e 20 64 61 74 61 62 61 73 65  ed when database
1480: 20 66 69 6c 65 73 20 61 72 65 20 72 65 6e 61 6d   files are renam
1490: 65 64 20 6f 72 0a 61 6c 69 61 73 65 64 20 69 6e  ed or.aliased in
14a0: 20 77 61 79 73 20 74 68 61 74 20 63 61 6e 20 6c   ways that can l
14b0: 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
14c0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 28 53 65 65  corruption..(See
14d0: 20 5b 75 6e 6c 69 6e 6b 20 63 6f 72 72 75 70 74   [unlink corrupt
14e0: 69 6f 6e 20 7c 20 31 5d 20 61 6e 64 20 5b 64 61  ion | 1] and [da
14f0: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
1500: 61 6c 69 61 73 69 6e 67 20 7c 20 32 5d 20 66 6f  aliasing | 2] fo
1510: 72 0a 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r.additional inf
1520: 6f 72 6d 61 74 69 6f 6e 2e 29 0a 3c 2f 70 3e 0a  ormation.).</p>.
1530: 0a 3c 6c 69 3e 3c 70 3e 0a 4f 75 74 20 6f 66 20  .<li><p>.Out of 
1540: 6d 65 6d 6f 72 79 20 28 4f 4f 4d 29 20 65 72 72  memory (OOM) err
1550: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 67 65  or conditions ge
1560: 6e 65 72 61 74 65 20 65 72 72 6f 72 20 6c 6f 67  nerate error log
1570: 67 69 6e 67 20 65 76 65 6e 74 73 0a 77 69 74 68  ging events.with
1580: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   the SQLITE_NOME
1590: 4d 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  M error code and
15a0: 20 61 20 6d 65 73 73 61 67 65 20 74 68 61 74 20   a message that 
15b0: 73 61 79 73 20 68 6f 77 20 6d 61 6e 79 20 62 79  says how many by
15c0: 74 65 73 0a 6f 66 20 6d 65 6d 6f 72 79 20 77 65  tes.of memory we
15d0: 72 65 20 72 65 71 75 65 73 74 65 64 20 62 79 20  re requested by 
15e0: 74 68 65 20 66 61 69 6c 65 64 20 61 6c 6c 6f 63  the failed alloc
15f0: 61 74 69 6f 6e 2e 0a 3c 2f 70 3e 0a 0a 3c 6c 69  ation..</p>..<li
1600: 3e 3c 70 3e 49 2f 4f 20 65 72 72 6f 72 73 20 69  ><p>I/O errors i
1610: 6e 20 74 68 65 20 4f 53 2d 69 6e 74 65 72 66 61  n the OS-interfa
1620: 63 65 20 67 65 6e 65 72 61 74 65 20 65 72 72 6f  ce generate erro
1630: 72 20 6c 6f 67 67 69 6e 67 20 65 76 65 6e 74 73  r logging events
1640: 2e 0a 54 68 65 20 6d 65 73 73 61 67 65 20 74 6f  ..The message to
1650: 20 74 68 65 73 65 20 65 76 65 6e 74 73 20 67 69   these events gi
1660: 76 65 73 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d  ves the line num
1670: 62 65 72 20 69 6e 20 74 68 65 20 73 6f 75 72 63  ber in the sourc
1680: 65 20 63 6f 64 65 20 77 68 65 72 65 0a 74 68 65  e code where.the
1690: 20 65 72 72 6f 72 20 6f 72 69 67 69 6e 61 74 65   error originate
16a0: 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 6e 61  d and the filena
16b0: 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  me associated wi
16c0: 74 68 20 74 68 65 20 65 76 65 6e 74 20 77 68 65  th the event whe
16d0: 6e 0a 74 68 65 72 65 20 69 73 20 61 20 63 6f 72  n.there is a cor
16e0: 72 65 73 70 6f 6e 64 69 6e 67 20 66 69 6c 65 2e  responding file.
16f0: 20 3c 2f 70 3e 0a 0a 3c 6c 69 3e 3c 70 3e 57 68   </p>..<li><p>Wh
1700: 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  en database corr
1710: 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1720: 65 64 2c 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  ed, an SQLITE_CO
1730: 52 52 55 50 54 20 65 72 72 6f 72 0a 6c 6f 67 67  RRUPT error.logg
1740: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
1750: 6e 76 6f 6b 65 64 2e 20 20 41 73 20 77 69 74 68  nvoked.  As with
1760: 20 49 2f 4f 20 65 72 72 6f 72 73 2c 20 74 68 65   I/O errors, the
1770: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1780: 65 78 74 0a 63 6f 6e 74 61 69 6e 73 20 74 68 65  ext.contains the
1790: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20   line number in 
17a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 6f 75  the original sou
17b0: 72 63 65 20 63 6f 64 65 20 77 68 65 72 65 20 74  rce code where t
17c0: 68 65 20 65 72 72 6f 72 0a 77 61 73 20 66 69 72  he error.was fir
17d0: 73 74 20 64 65 74 65 63 74 65 64 2e 3c 2f 70 3e  st detected.</p>
17e0: 0a 0a 3c 6c 69 3e 3c 70 3e 0a 41 6e 20 65 72 72  ..<li><p>.An err
17f0: 6f 72 20 6c 6f 67 67 65 72 20 63 61 6c 6c 62 61  or logger callba
1800: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ck is invoked on
1810: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65   SQLITE_MISUSE e
1820: 72 72 6f 72 73 2e 0a 54 68 69 73 20 69 73 20 75  rrors..This is u
1830: 73 65 66 75 6c 20 69 6e 20 64 65 74 65 63 74 69  seful in detecti
1840: 6e 67 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ng application d
1850: 65 73 69 67 6e 20 69 73 73 75 65 73 20 77 68 65  esign issues whe
1860: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 73 0a 61  n return codes.a
1870: 72 65 20 6e 6f 74 20 63 6f 6e 73 69 73 74 65 6e  re not consisten
1880: 74 6c 79 20 63 68 65 63 6b 65 64 20 69 6e 20 74  tly checked in t
1890: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
18a0: 6f 64 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 53  ode..</ul>..<p>S
18b0: 51 4c 69 74 65 20 73 74 72 69 76 65 73 20 74 6f  QLite strives to
18c0: 20 6b 65 65 70 20 65 72 72 6f 72 20 6c 6f 67 67   keep error logg
18d0: 65 72 20 74 72 61 66 66 69 63 20 6c 6f 77 20 61  er traffic low a
18e0: 6e 64 20 6f 6e 6c 79 20 73 65 6e 64 20 6d 65 73  nd only send mes
18f0: 73 61 67 65 73 0a 74 6f 20 74 68 65 20 65 72 72  sages.to the err
1900: 6f 72 20 6c 6f 67 67 65 72 20 77 68 65 6e 20 74  or logger when t
1910: 68 65 72 65 20 72 65 61 6c 6c 79 20 69 73 20 73  here really is s
1920: 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67 2e 20  omething wrong. 
1930: 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 0a 6d 69   Applications.mi
1940: 67 68 74 20 66 75 72 74 68 65 72 20 63 75 6c 6c  ght further cull
1950: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
1960: 67 65 20 74 72 61 66 66 69 63 20 0a 62 79 20 64  ge traffic .by d
1970: 65 6c 69 62 65 72 61 74 65 6c 79 20 69 67 6e 6f  eliberately igno
1980: 72 65 20 63 65 72 74 61 69 6e 20 63 6c 61 73 73  re certain class
1990: 65 73 20 6f 66 20 65 72 72 6f 72 0a 6d 65 73 73  es of error.mess
19a0: 61 67 65 73 20 74 68 61 74 20 74 68 65 79 20 64  ages that they d
19b0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
19c0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
19d0: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  an application t
19e0: 68 61 74 0a 6d 61 6b 65 73 20 66 72 65 71 75 65  hat.makes freque
19f0: 6e 74 20 64 61 74 61 62 61 73 65 20 73 63 68 65  nt database sche
1a00: 6d 61 20 63 68 61 6e 67 65 73 20 6d 69 67 68 74  ma changes might
1a10: 20 77 61 6e 74 20 74 6f 20 69 67 6e 6f 72 65 20   want to ignore 
1a20: 61 6c 6c 0a 53 51 4c 49 54 45 5f 53 43 48 45 4d  all.SQLITE_SCHEM
1a30: 41 20 65 72 72 6f 72 73 2e 3c 2f 70 3e 0a 0a 3c  A errors.</p>..<
1a40: 68 31 3e 53 75 6d 6d 61 72 79 3c 2f 68 31 3e 0a  h1>Summary</h1>.
1a50: 0a 3c 70 3e 54 68 65 20 75 73 65 20 6f 66 20 74  .<p>The use of t
1a60: 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 20  he error logger 
1a70: 63 61 6c 6c 62 61 63 6b 20 69 73 20 68 69 67 68  callback is high
1a80: 6c 79 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a  ly recommended..
1a90: 54 68 65 20 64 65 62 75 67 67 69 6e 67 20 69 6e  The debugging in
1aa0: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 74  formation that t
1ab0: 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 20  he error logger 
1ac0: 70 72 6f 76 69 64 65 73 20 68 61 73 20 70 72 6f  provides has pro
1ad0: 76 65 6e 0a 76 65 72 79 20 75 73 65 66 75 6c 20  ven.very useful 
1ae0: 69 6e 20 74 72 61 63 6b 69 6e 67 20 64 6f 77 6e  in tracking down
1af0: 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
1b00: 73 20 74 68 61 74 20 6f 63 63 75 72 73 20 77 69  s that occurs wi
1b10: 74 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a  th applications.
1b20: 61 66 74 65 72 20 74 68 65 79 20 67 65 74 20 69  after they get i
1b30: 6e 74 6f 20 74 68 65 20 66 69 65 6c 64 2e 20 20  nto the field.  
1b40: 54 68 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72  The error logger
1b50: 20 63 61 6c 6c 62 61 63 6b 20 68 61 73 20 61 6c   callback has al
1b60: 73 6f 20 0a 70 72 6f 76 65 6e 20 75 73 65 66 75  so .proven usefu
1b70: 6c 20 69 6e 20 63 61 74 63 68 69 6e 67 20 65 72  l in catching er
1b80: 72 6f 72 73 20 6f 63 63 61 73 69 6f 6e 61 6c 20  rors occasional 
1b90: 65 72 72 6f 72 73 20 74 68 61 74 20 74 68 65 20  errors that the 
1ba0: 61 70 70 6c 69 63 61 74 69 6f 6e 0a 6d 69 73 73  application.miss
1bb0: 65 73 20 62 65 63 61 75 73 65 20 6f 66 20 69 6e  es because of in
1bc0: 63 6f 6e 73 69 73 74 65 6e 74 20 63 68 65 63 6b  consistent check
1bd0: 69 6e 67 20 6f 66 20 41 50 49 20 72 65 74 75 72  ing of API retur
1be0: 6e 20 63 6f 64 65 73 2e 0a 44 65 76 65 6c 6f 70  n codes..Develop
1bf0: 65 72 73 20 61 72 65 20 65 6e 63 6f 75 72 61 67  ers are encourag
1c00: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
1c10: 61 6e 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 20  an error logger 
1c20: 63 61 6c 6c 62 61 63 6b 20 65 61 72 6c 79 0a 69  callback early.i
1c30: 6e 20 74 68 65 20 64 65 76 65 6c 6f 70 6d 65 6e  n the developmen
1c40: 74 20 63 79 63 6c 65 20 69 6e 20 6f 72 64 65 72  t cycle in order
1c50: 20 74 6f 20 73 70 6f 74 20 75 6e 65 78 70 65 63   to spot unexpec
1c60: 74 65 64 20 62 65 68 61 76 69 6f 72 20 71 75 69  ted behavior qui
1c70: 63 6b 6c 79 2c 0a 61 6e 64 20 74 6f 20 6c 65 61  ckly,.and to lea
1c80: 76 65 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67  ve the error log
1c90: 67 65 72 20 63 61 6c 6c 62 61 63 6b 20 74 75 72  ger callback tur
1ca0: 6e 65 64 20 6f 6e 20 74 68 72 6f 75 67 68 20 64  ned on through d
1cb0: 65 70 6c 6f 79 6d 65 6e 74 2e 0a 49 66 20 74 68  eployment..If th
1cc0: 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 20 6e  e error logger n
1cd0: 65 76 65 72 20 66 69 6e 64 73 20 61 20 70 72 6f  ever finds a pro
1ce0: 62 6c 65 6d 2c 20 74 68 65 6e 20 6e 6f 20 68 61  blem, then no ha
1cf0: 72 6d 20 69 73 20 64 6f 6e 65 2e 20 20 0a 42 75  rm is done.  .Bu
1d00: 74 20 66 61 69 6c 75 72 65 20 74 6f 20 73 65 74  t failure to set
1d10: 20 75 70 20 61 6e 20 61 70 70 72 6f 70 72 69 61   up an appropria
1d20: 74 65 20 65 72 72 6f 72 20 6c 6f 67 67 65 72 20  te error logger 
1d30: 6d 69 67 68 74 20 63 6f 6d 70 72 6f 6d 69 73 65  might compromise
1d40: 0a 64 69 61 67 6e 6f 73 74 69 63 20 63 61 70 61  .diagnostic capa
1d50: 62 69 6c 69 74 69 65 73 20 6c 61 74 65 72 20 6f  bilities later o
1d60: 6e 2e 3c 2f 70 3e 0a                             n.</p>.