Since you obviously know PHP, tell me - if you wanted error #4 in a file (where you obviously have no idea how many errors there are), how would you fseek to the appropriate spot? You fseek a byte position from the beginning of the file. You could use something arbitrary, like you said, and hope you hit a correct location - but as some errors can be long, and some can be short, that's a stab in the dark and quite unreliable....
You could read 4KB from the beginning of the file, see if you have a delimiter, get next 4KB, repeat, until you hit the right spot. This could prevent you from having to load the entire file, I suppose.
No, I'd probably just load the entire file into memory and be done with it. ;) I'd also probably add in a link to simply download the file (because you can use flush the buffer while outputting a file you don't run into the same memory limit issues if done properly. That way you'd at least be able to download the file from the ACP without having to launch FTP, if you couldn't actually view it there.
And to be fair, 20MB error logs are pretty rare. Most SQL error logs are 5MB or less.