I think making this non-recursive only complicates the code because there is no separation between policy (when to delete the oldest log file) and mechanism (a function that will find and remove the oldest log file without any checks about when to do it). Under this factoring, code can then look like:

```
func removeOldestLog(...) error {
  // Return an error if there is no log identified to be deleted or the delete fails?
  // All the same fun stuff as above with regards to getting
  // the oldest file and deleting
}

func removeMaxRotatedLogs() {
  timeStrs, err := self.rotatedTimeStrs()
  if err != nil {
    self.errHandler(MinorRotationError{err})
    return
  }

  filesToRemove := len(timeStrs) - self.MaxRotatedLogs
  for removed := 0; removed < filesToRemove; removed++ {
    if err = self.removeOldestLog(); err != nil {
      self.errHandler(MinorRotationError{err})
      return
    }
  }
}
```